IT

git/git-shell 관련 문제를 디버그하려면 어떻게 해야 합니까?

itgroup 2023. 7. 12. 23:43
반응형

git/git-shell 관련 문제를 디버그하려면 어떻게 해야 합니까?

git/git-shell에 대한 디버그 정보를 얻으려면 어떻게 해야 합니까?

나는 문제가 있었어, 그것은.user1문제 없이 저장소를 복제할 수 있습니다.user2빈 항목만 복제할 수 있습니다.나는 설정했습니다.GIT_TRACE=1하지만 유용한 것은 아무 것도 알려주지 않았습니다.

결국 오랜 시행착오 끝에 파일에 대한 권한 문제인 것으로 드러났습니다.적절한 오류 메시지가 표시되면 이 문제가 단락될 수 있습니다.

더 자세한 출력을 위해 다음을 사용합니다.

GIT_CURL_VERBOSE=1 GIT_TRACE=1 git pull origin master

디버깅

Git에는 Git 문제를 디버그하는 데 사용할 수 있는 상당히 완전한 추적 세트가 포함되어 있습니다.

다음 변수를 정의하여 설정할 수 있습니다.

  • GIT_TRACE은 반적인흔경우의일적,,
  • GIT_TRACE_PACK_ACCESS액세스 , " 파일액스추적팩세,",
  • GIT_TRACE_PACKET작업을 의 경우, "" " " " " " 입니다.
  • GIT_TRACE_PERFORMANCE하기 위해, 능데이를기위해기성하록,
  • GIT_TRACE_SETUP 및에 대한 내용은 호작용하상리포는리및대검정한보보오다려하같음십시이과면를색에경지환토▁for상오▁inform하십시같이▁anditory음▁repos다.
  • GIT_MERGE_VERBOSITY병합 : 0-5 경우, 다음과 같이 지정합니다(: 0-5).
  • GIT_CURL_VERBOSE메시지를 됩니다(" " " " " " " " " " ( " " " 에 함).curl -v),
  • GIT_TRACE_SHALLOW얕은 리포지토리의 가져오기/디버깅을 위한 디버깅.

가능한 값은 다음과 같습니다.

  • true,1또는2 stderr에게 를 쓰기 , stderr은 지쓰기위해게를편에,위해▁tost▁to,
  • 하는 절대 /지정된 파일의 출력을 추적합니다.

자세한 내용은 Git 내부 - 환경 변수를 참조하십시오.


SSH

SSH 문제의 경우 다음 명령을 사용합니다.

echo 'ssh -vvv "$*"' > ssh && chmod +x ssh
GIT_SSH="$PWD/ssh" git pull origin master

또는 사용ssh사용자의 자격 증명을 확인합니다.

ssh -vvvT git@github.com

또는 HTTPS 포트를 통해:

ssh -vvvT -p 443 git@ssh.github.com

고참: 의수줄다의 .-v장황성 수준을 줄이기 위해.


$ GIT_TRACE=1 git status
20:11:39.565701 git.c:350               trace: built-in: git 'status'

$ GIT_TRACE_PERFORMANCE=$PWD/gc.log git gc
Counting objects: 143760, done.
...
$ head gc.log 
20:12:37.214410 trace.c:420             performance: 0.090286000 s: git command: 'git' 'pack-refs' '--all' '--prune'
20:12:37.378101 trace.c:420             performance: 0.156971000 s: git command: 'git' 'reflog' 'expire' '--all'
...

$ GIT_TRACE_PACKET=true git pull origin master
20:16:53.062183 pkt-line.c:80           packet:        fetch< 93eb028c6b2f8b1d694d1173a4ddf32b48e371ce HEAD\0multi_ack thin-pack side-band side-band-64k ofs-delta shallow no-progress include-tag multi_ack_detailed symref=HEAD:refs/heads/master agent=git/2:2.6.5~update-ref-initial-update-1494-g76b680d
...

이것을 사용해 보십시오.

GIT_TRACE=1 git pull origin master

SSH를 통해 실행되는 경우 다음을 사용할 수 있습니다.

디버그 레벨 2 및 3에 대해 각각 -vv 또는 -vvv 유형의 디버그 레벨이 높은 경우:

# Debug level 1
GIT_SSH_COMMAND="ssh -v" git clone <repositoryurl>

# Debug level 2
GIT_SSH_COMMAND="ssh -vv" git clone <repositoryurl>

# Debug level 3
GIT_SSH_COMMAND="ssh -vvv" git clone <repositoryurl>

이것은 주로 서버의 공용 및 개인 키 문제를 처리하는 데 유용합니다.이 명령은 'git clone'뿐만 아니라 모든 git 명령에 사용할 수 있습니다.

Git 2.9.x/2.10(2016년 3분기)에는 다음과 같은 디버그 옵션이 추가되었습니다.GIT_TRACE_CURL.

73e57aa, 74c682d(2016년 5월 23일)를 Elia Pinto()devzero2000의 커밋을 참조하십시오.
지원자:토르스텐 뵈거스하우젠(),tboegi 램지 존스(), 주니오 차마노(),gitster 에릭 sunshineco선샤인(), 제프 peff킹().
(주니오 C 하마노에 의해 합병 -- -- 커밋 2f84df2, 2016년 7월 6일)

http.c을합니다를 합니다.GIT_TRACE_CURL 변수

» GIT_TRACE_CURL하여 보다 한 정보를 얻을 수 있습니다.GIT_CURL_VERBOSE특히 전체 전송 헤더와 교환된 모든 데이터 페이로드.
특정 상황에서 보다 철저한 디버깅 분석이 필요한 경우 유용할 수 있습니다.

설명서에는 다음이 명시됩니다.

GIT_TRACE_CURL

Git Transport Protocol의 모든 수신 및 송신 데이터(설명 정보 포함)에 대해 전체 추적을 컬로 덤프할 수 있습니다.
이것은 하는 것과 비슷합니다.curl --trace-ascii명령행에서.

은 이옵은재합니다의정설 합니다.GIT_CURL_VERBOSE환경 변수입니다.


답변에 사용된 새로운 옵션을 확인할 수 있지만 Git 2.11(2016년 4분기) 테스트에서도 확인할 수 있습니다.

커밋 14e2411, 커밋 81590bf, 커밋 4527aa1, 커밋 4ee6c6(2016년 9월 7일) 참조.devzero2000
(주니오 C 하마노에 의해 합병 -- -- 커밋 930b67e, 2016년 9월 12일)

새기사를 합니다.GIT_TRACE_CURL사용되지 않는 대신 환경 변수 GIT_CURL_VERBOSE.

GIT_TRACE_CURL=true git clone --quiet $HTTPD_URL/smart/repo.git

모든 명령이 반드시 추적을 내보내는 것은 아닙니다.
예를 들어, reflog 만료 기계가 추적 이벤트를 방출하도록 교육받기 전에 Git 2.32(2021년 2분기)가 필요합니다.

Han-Wen Nienhuys hanwen()의 커밋 34c3199 (2021년 4월 23일)를 참조하십시오.
(주니오 C 하마노에 의해 합병 -- -- 850356, 2021년 5월 7일 커밋)

리필로그 만료도 refs/debug추적합니다.

사인 오프 바이: 한웬 니엔휴스


2 2022)를 사용하여 Git 2.39 (Q4 2022)의 합니다.h2h3 in 듈인GIT_CURL_VERBOSE기타 등등.

Glen Choo()chooglencommit b637a41(2022년 11월 11일)을 참조하십시오.
제프 peff킹()의 커밋 73c49a4(2022년 11월 11일) 참조.
(주니오 C 하마노에 의해 합병 -- -- 6adf170, 2022년 11월 23일 커밋)

http리액트 컬h2h3

도움을 받은 사람: 제프 킹
사인 오프 바이: 글렌 추
승인된 사용자:테일러 블라우

와 함께GIT_TRACE_CURL=1또는GIT_CURL_VERBOSE=1,"인증" 및 "쿠키"와 같은 중요한 헤더는 수정됩니다.
하지만, 커밋 f8c3724 이후, 컬은h2h3module할 때 호출됨"http/2"의 "http/2"에 합니다.info수정되지 않는 것.
를 들면 를들면예,

echo 'github.com  TRUE    /   FALSE   1698960413304   o   foo=bar' >cookiefile &&
GIT_TRACE_CURL=1 GIT_TRACE_CURL_NO_DATA=1 git \
  -c 'http.cookiefile=cookiefile' \
  -c 'http.version=' \
  ls-remote https://github.com/git/git refs/heads/main 2>output &&
grep 'cookie' output

다음과 같은 출력을 생성합니다.

23:04:16.920495 http.c:678              == Info: h2h3 [cookie: o=foo=bar]
23:04:16.920562 http.c:637              => Send header: cookie: o=<redacted>

확인할 수 있도록 티치h2h3정보에 있는 헤더를 수정하고 기존 헤더 수정 논리를 사용하여 수정합니다.
이렇게 하면 이전 커밋에서 언급한 손상된 수정 작업 로직이 수정되므로 수정 작업 테스트를 HTTP2 아래에 전달된 것으로 표시합니다.

Git 2.22 (2019년 2분기)는 Jeff Hostetler의 위원회 4512e와 함께 소개합니다.

trace2 trace 새 생성하기

git에 대한 .
궁극적인 목적은 전류를 교체하는 것입니다.trace_printf*그리고.trace_performance*통된일루틴련의 가 있는 git_trace2*일상적인

API 에도 printf API를 하고 있습니다.trace2구조화된 데이터를 쓸 수 있는 고정 필드가 있는 상위 수준의 이벤트 동사를 제공합니다.
따라서 외부 도구의 사후 처리 및 분석이 더 쉬워집니다.

Trace2는 3개의 출력 대상을 정의합니다.
" 러한설환를변수 " 용사여설정니다됩하이경정은를다▁the▁environ▁these니▁using▁variables▁"ment설▁set▁are"를 사용하여 설정됩니다.GIT_TR2", "GIT_TR2_PERF그리고 "GIT_TR2_EVENT".
이 값은 "1" 또는 절대 경로 이름으로 설정할 수 있습니다(전류와 동일).GIT_TRACE).

이름은 " " " " " " " " " " " " 를 합니다.GIT_TRACExxx,것은 아니다.GIT_TRxxx.
사실은 래서사실은.GIT_TRACE2,GIT_TRACE2_PERF또는GIT_TRACE2_EVENT.
아래에 언급된 Git 2.22 이름 바꾸기를 참조하십시오.

다음은 이전 환경 변수 이름을 사용한 이 새로운 추적 기능에 대한 초기 작업입니다.

  • GIT_TR2는 의대품될예다니입정이체ment▁for▁replace다니▁a▁be▁to▁is▁intended예정을 대체하기 위한 것입니다.GIT_TRACE및 명령 요약 데이터를 기록합니다.

  • GIT_TR2_PERF는 의대으사니다용됩로품체ment▁for▁replace의 대체품으로 됩니다.GIT_TRACE_PERFORMANCE.
    명령 프로세스, 스레드, repo, 절대 및 상대 경과 시간에 대한 열을 사용하여 출력을 확장합니다.
    하위 프로세스 시작/중지, 스레드 시작/중지 및 스레드 단위 함수 중첩에 대한 이벤트를 보고합니다.

  • GIT_TR2_EVENT는 새로운 구조화된 형식입니다.이벤트 데이터를 일련의 JSON 레코드로 작성합니다.

에 대한 은 다른 trace2를 없이 됩니다.trace_printf*또는trace_performance*일상적인

조쉬 스테드먼()steadmon의 커밋 a4d3a28(2019년 3월 21일)을 참조하십시오.
(주니오 C 하마노에 의해 합병 -- -- 커밋 1b40314, 2019년 5월 8일)

trace2 대상에

디렉토리를, 에합니다.trace2 환경변수 값은 다음과 같습니다.
파일 이름은 trace2 SID의 최종 구성 요소에 따라 지정되고 잠재적 충돌을 방지하기 위한 카운터가 뒤따릅니다.

이를 통해 모든 Git 호출에 대한 추적을 수집할 때 관련 정보를 무조건 설정하여 보다 편리하게 수집할 수 있습니다.trace2 nameenvvvar 파일 이름.


또한 커밋 f672디(2019년 4월 29일), 커밋 81567ca, 커밋 0881b9, 커밋 bad229a, 커밋 26c6f25, 커밋 becc9db6, 커밋 800a7f9, 커밋 a7bc01e, 커밋 39f4317, 커밋 a089724,jeffhostetler 커밋 1703751(2019년 4월 15일)을 참조하십시오.
(주니오 C 하마노에 의해 합병 -- -- 커밋 5b2d1c0, 2019년 5월 13일)

이제 새로운 설명서에는 시스템 글로벌 구성 파일(리포지토리 로컬 및 워크트리 구성 파일 및-c명령줄 인수는 허용되지 않습니다.)

:

$ git config --global trace2.normalTarget ~/log.normal
$ git version
git version 2.20.1.155.g426c96fcdb

수확량

$ cat ~/log.normal
12:28:42.620009 common-main.c:38                  version 2.20.1.155.g426c96fcdb
12:28:42.620989 common-main.c:39                  start git version
12:28:42.621101 git.c:432                         cmd_name version (version)
12:28:42.621215 git.c:662                         exit elapsed:0.001227 code:0
12:28:42.621250 trace2/tr2_tgt_normal.c:124 atexit elapsed:0.001265 code:0

성능 측정의 경우:

$ git config --global trace2.perfTarget ~/log.perf
$ git version
git version 2.20.1.155.g426c96fcdb

수확량

$ cat ~/log.perf
12:28:42.620675 common-main.c:38                  | d0 | main                     | version      |     |           |           |            | 2.20.1.155.g426c96fcdb
12:28:42.621001 common-main.c:39                  | d0 | main                     | start        |     |  0.001173 |           |            | git version
12:28:42.621111 git.c:432                         | d0 | main                     | cmd_name     |     |           |           |            | version (version)
12:28:42.621225 git.c:662                         | d0 | main                     | exit         |     |  0.001227 |           |            | code:0
12:28:42.621259 trace2/tr2_tgt_perf.c:211         | d0 | main                     | atexit       |     |  0.001265 |           |            | code:0

Git 2.23 (2019년 3분기)에 문서화된 바와 같이, 사용할 환경 변수는 입니다.

카를로 마르셀로 아레나스 벨론()의 커밋 carenas6114a40(2019년 6월 26일)을 참조하십시오.
Aévar avarArnförd Bjarmason()의 커밋 3efa1c6(2019년 6월 12일)을 참조하십시오.
(Junio C Hamano에 의해 합병 -- -- 위원회 9eaaa4, 2019년 7월 9일)

이는 Git 2.22에서 수행된 작업에 따른 입니다. 4e0d3aa, szeder Garbor()szeder의 commit e4b75d6(2019년 5월 19일).
(주니오 C 하마노에 의해 합병되었습니다 -- -- 463dca6, 2019년 5월 30일 커밋)

trace2을 GIT_TRACE2로 변경합니다. GIT_TRACE2는 *

해야 할 는,GIT_TR2*envars는 너무 불분명하고, 일관성이 없으며, 추합니다.

의 확립된 대대의부분세기성.GIT_*사용하지 약어를 사용합니다.GIT_DIR,GIT_COMMON_DIR,GIT_DIFF_OPTS) 약어가 무엇인지는 꽤 분명합니다.DIR그리고.OPTS의 약자입니다.
가.TR무슨 뜻입니까?추적, 기존, 트레일러, 트랜잭션, 전송, 변환, 변환, 변환, 변환, 이식, 전송, 순회, 트리, 트리거, 잘라내기, 신뢰 또는...?!

이름의 '2' 접미사에서 알 수 있듯이 trace2 기능은 결국 Git의 원래 추적 기능을 대체하게 됩니다.
해당 환경변수가 그 뒤를 따르며, 원래의 환경변수가 그 뒤를 따를 것으로 예상하는 것이 타당합니다.GIT_TRACE은 그이부르변수들라고 GIT_TRACE2'라는 것은 없습니다.GIT_TR'.

의 모든 있게 trace2'에 trace2 ' 션없에, ' 음섹없에 없음tr2'.

OTOH, 우리는 이러한 환경 변수의 이름에서 "추적"의 마지막글자를 생략함으로써 아무것도 얻지 못합니다.

그럼 이름을 모두 바꾸겠습니다.GIT_TR2* - 환변:GIT_TRACE2*그들이 안정적으로 석방되기 전에.


Git 2.24(2019년 3분기)는 Git 저장소 초기화를 개선합니다.

커밋 22932d9,peff 커밋 5732f2b, 커밋 58ebccb(2019년 8월 6일) 참조.
(Junio C Hamano에 의해 합병됨 -- -- commit b4a1eec, 2019년 9월 9일)

common-main: 지연 trace2 초기화

합니다.trace2모든 프로그램(내장되어 있지 않은 프로그램도 포함)이 추적을 활성화할 수 있도록 공통 메인(main) 기능의 시스템입니다.

그렇지만trace2시작은 추적 여부를 결정하기 위해 실제로 디스크 구성을 읽어야 하기 때문에 상대적으로 무겁습니다.
이로 인해 다른 공통 메인 초기화와 예기치 않은 상호 작용이 발생할 수 있습니다.예를 들어, 우리는 전화하기 전에 구성 코드로 끝날 것입니다.initialize_the_repository() 일반적인 불변량인 불변성인적그일리반고▁that▁the▁and.the_repository NULL은 never NULL은 보유하지 않습니다.

밀어보겠습니다.trace2common-main에서 더 로, 가 실행하기 까지.cmd_main().


2 2.24 (2019년 4분기)의 합니다.trace2서브시스템이 더 예쁘게 포맷되었습니다.

커밋 742ed63,jeffhostetler 커밋 344305, 커밋 c2b890a(2019년 8월 9일), 커밋 ad43e37, 커밋 04f10d3, 커밋 da4589c(2019년 8월 8일), 커밋 371df1b(2019년 7월 31일)를 참조하십시오.
(주니오 C 하마노에 의해 합병 -- -- 커밋 93fc876, 2019년 9월 30일)

그리고, 여전히 Git 2.24.

커밋 87db61a,steadmon 커밋 83e57b0(2019년 10월 4일), 커밋 2254101, 커밋 3d4548e(2019년 10월 3일)를 참조하십시오.
(주니오 C 하마노에 의해 합병 -- 2019년 10월 15일 커밋 0ce4d9에서)

trace2대상 디렉터리에 파일이 너무 많은 경우 새 추적 삭제

사인 오프 바이: 조쉬 스테드먼

trace2파일을 대상 디렉터리에 쓸 수 있습니다.
사용량이 많으면 이 디렉터리가 파일로 가득 차서 추적 처리 시스템에 어려움을 줄 수 있습니다.

옵션을 합니다.trace2.maxFiles의 합니다.trace2대상 디렉터리에 씁니다.

다음 동작은 다음과 같은 경우에 활성화됩니다.maxFiles정수로 됩니다.

  • trace2대상 디렉터리에 파일을 쓰고, 먼저 추적을 폐기해야 하는지 여부를 확인합니다.
    다음과 같은 경우 트레이스를 폐기해야 합니다.
    • 너무 많은 파일이 있음을 알리는 Sentinel 파일이 있습니다.
    • 가 파일 수를 초과합니다.trace2.maxFiles.
      는 후의경우, 우는다같이은보라는 이름의 .git-trace2-discard향후 점검을 가속화하기 위해.

별도의 추적 처리 시스템이 생성된 추적을 처리한다고 가정합니다. 일단 센티넬 파일을 처리하고 제거하면 새 추적 파일을 다시 생성하는 것이 안전해야 합니다.

기본값은 과 같습니다.trace2.maxFiles0으로 설정하면 파일 수 검사가 비활성화됩니다.

같은 새 변수를 할 수도 .GIT_TRACE2_MAX_FILES.


24분기)는에 대해 trace2에 대해 가르칩니다.git push단상들

커밋 25e4b80, 커밋 5fc3118(2019년 10월 2일)을 참조하십시오.steadmon
(주니오 C 하마노에 의해 합병 -- -- 2019년 10월 15일 커밋 3b9ec27에서)

trace2 push계측기 추가

사인 오프 바이: 조쉬 스테드먼

및 에 트레이스2 영역을 추가하여 다양한 푸시 단계에서 소요된 시간을 더 잘 추적할 수 있습니다.

  • 목록 참조
  • 하위 모듈 확인 중
  • 하위 모듈 푸시
  • 기준 푸시

2)와 깃 2.25 (2020년 1분기)의 일부.Documentation/technical 헤로이로 *.hfiles 파일

커밋 6c51cb5, 커밋 95a77d, 커밋 95a77d, 커밋 fbfa30, 커밋 f1ecbe0, 커밋 4c4066d, 커밋 7db0305, 커밋 f3b9055, 커밋 97b1f2, 커밋 13a9c8, 커밋 c0be43f, 커밋 19ef3d, 커밋 301d, 커밋 301d595, 커밋 3a1b341, 커밋 db1, 커밋 db1, 커밋 db1, 커밋 db3commit 3comm헤바 HebaWaly왈리()에 의해 13c4d7e(2019년 11월 17일)를 커밋합니다.
(주니오 C 하마노에 의해 합병 -- -- 커밋 26c816a, 2019년 12월 16일)

trace2의사를 로 옮기다.trace2.h

사인 오프 바이: 헤바 왈리

에서 이동합니다.Documentation/technical/api-trace2.txttrace2.h개발자들이 다른 문서 파일에서 찾는 대신 코드 옆에 있는 사용 정보를 찾는 것이 더 쉽기 때문입니다.

에서 functions 됩니다.Documentation/technical/api-trace2.txt파이일 trace2.h에 doc 파일에 대한 링크가 추가되어 있는 별도의 doc 파일에 있는 것이 더 적절해 보이는 세부 정보로 가득 차 있기 때문입니다.또한 헤더 파일의 문서와 동기화하기 어려운 중복된 정보를 방지하기 위해 함수 문서가 제거됩니다.

(그 재편성은 다른 명령에 부작용을 일으켰지만, Jeff peffKing ()에 의해 cc4f2eb (2020년 2월 14일)에서 Git 2.25.2 (2020년 3월)로 설명되고 수정되었습니다.
(Merged by Junio C Hamano -- gitster -- in commit 1235384, 17 Feb 2020))


Git 2.27(2020년 2분기) 포함:환경 변수의 로깅을 허용하는 Trace2 향상.

조쉬 스테드먼()steadmon의 커밋 3d3adaa(2020년 3월 20일)를 참조하십시오.
(주니오 C 하마노에 의해 합병 -- -- 810dc64, 2020년 4월 22일 커밋)

trace2Git를 로그 환경 변수로 티칭

사인 오프 바이: 조쉬 스테드먼
아큐드바이: 제프 호스텔러

통해 는 이미 있는 구성할 수 (trace2 " " " " Git " 상 " 대 " 구 " 성 " 참 " 라 " 미 " 터 " 조 " 를 " 니 " 다 " 록 " " 있 " 습 " 할 " 파 " 수 " 기 " 를 " 통 " 해 " 는 " 미 " 이 " ▁the " ▁via "trace2_cmd_list_config()함수)를 선택합니다.그러나 많은 구성 매개 변수가 환경 변수를 통한 재정의도 허용하기 때문에 불완전한 그림이 허용될 수 있습니다.

로그를 합니다.trace2_cmd_list_env_vars()기존 구성 매개변수 로깅 구현을 모델로 한 기능 및 지원 구현.


2)을 사용하여 를 Git 2.27(2020년 2분기)과 .start_progress() 리고그고.stop_progress()호출자"로 지정합니다.region미행의

에밀리 셰퍼()nasamuffin의 커밋 98a1364(2020년 5월 12일)를 참조하십시오.
(주니오 C 하마노에 의해 합병됨 -- ---- 2020년 5월 14일 커밋 98abce에서)

trace2로그 진행 시간 및 처리량

사인 오프 바이: 에밀리 셰퍼

하나의 수술만을 가르치는 것보다, '와 같은.git fetch처리량을 추적에 기록하는 방법, 진행률 라이브러리 자체에 툴링을 추가하면 느려 보일있는 광범위한 사용자 작업에 대해 배울있습니다.

진행률을 표시하는 작업은 느리게 실행될 가능성이 높고 성능을 모니터링하고자 하는 작업입니다.

개체 수와 데이터 전송 크기를 표시함으로써 작업이 예상대로 확장되도록 몇 가지 파생 측정을 수행할 수 있습니다.

그리고:

Git 2.27(2020년 2분기)을 사용하여 최근 변경 사항을 마지막으로 수정하여 진행률 API를 추적 가능한 지역으로 사용할 수 있습니다.

데릭 스톨리()derrickstolee의 커밋 3af029c(2020년 5월 15일)를 참조하십시오.
(주니오 C 하마노에 의해 합병 -- -- 85d6e28, 2020년 5월 20일 커밋)

progresstrace2_region_leave()전화를 한 후에야_enter()

사인 오프 바이: 데릭 스톨리

가 API를 합니다.start_progress()로 그리고 로 의존합니다.display_progress()그리고.stop_progress()다음과 같은 경우 작동하지 않는 기능start_progress()호출되지 않았습니다.

에 통화를 추가했기 때문에trace2_region_enter()start_progress()은 진 API 함 수 trace2 API 호 행 경 에 trace2 건 다 니 뜁 한 너 이 러 을 우 은 과 출 같 은 호 음 출 다 다 호 의 한 른 출에대 호출을 수 있도록 .start_progress()진행 구조에서 호출되지 않았습니다.

구적으로, 전지않음라고 부르지 .trace2_region_leave()stop_progress()가 전화를 때.start_progress()그것은 일치를 불렀을 것입니다.trace2_region_enter().


마지막 부분은 Git 2.29(2020년 4분기)에서 더욱 견고합니다.

마틴 오그렌()none의 커밋 ac900fd(2020년 8월 10일)를 참조하십시오.
(주니오 C 하마노에 의해 합병 -- -- 6ec620, 2020년 8월 17일 위원회에서)

확인하기 전에 참조를 취소하지 progress마십시오.NULL

사인 오프 바이: 마틴 오그렌

stop_progress()우리는 그것을 확인하기 위해 조심합니다.p_progress참조를 취소하기 전에는 NULL이 아니지만, 그 때는 이미 호출할 때 참조를 무시했습니다.finish_if_sparse(*p_progress).
그리고, 우리는 계속해서 맹목적으로 그것을 다시 언급하지 않을 것입니다.stop_progress_msg().


Git 2.29 (2020년 4분기)와 함께, 이번에는 Git 개발 환경에서 훨씬 더 많은 추적이 있습니다.

Han-Wen Nienhuys()hanwen의 commit 4441f42(2020년 9월 9일)를 참조하십시오.
(주니오 C 하마노에 의해 합병 -- -- commit c9a04f0, 2020년 9월 22일)

refs덧셈GIT_TRACE_REFS

사인 오프 바이: 한웬 니엔휴스

되면, 환에설정면되경,면되,GIT_TRACE_REFSgit인쇄 작업 및 결과가 참조 스토리지 백엔드를 통과할 때 출력됩니다.이렇게 하면 서로 다른 참조 백엔드 간의 불일치를 디버깅하는 데 도움이 됩니다.

예:

$ GIT_TRACE_REFS="1" ./git branch
15:42:09.769631 refs/debug.c:26         ref_store for .git
15:42:09.769681 refs/debug.c:249        read_raw_ref: HEAD: 0000000000000000000000000000000000000000 (=> refs/heads/ref-debug) type 1: 0
15:42:09.769695 refs/debug.c:249        read_raw_ref: refs/heads/ref-debug: 3a238e539bcdfe3f9eb5010fd218640c1b499f7a (=> refs/heads/ref-debug) type 0: 0
15:42:09.770282 refs/debug.c:233        ref_iterator_begin: refs/heads/ (0x1)
15:42:09.770290 refs/debug.c:189        iterator_advance: refs/heads/b4 (0)
15:42:09.770295 refs/debug.c:189        iterator_advance: refs/heads/branch3 (0)

git이제 관리 페이지에 다음 항목이 포함됩니다.

GIT_TRACE_REFS

참조 데이터베이스의 작업에 대한 추적 메시지를 활성화합니다.GIT_TRACE사용 가능한 추적 출력 옵션의 경우.


Git 2.30 (Q1 2021)과 함께, 예를 들어.die()그리고.error()로의 방문.warning()또한 trace2 이벤트를 트리거합니다.

조나단 jhowtan탄()의 커밋 0ee10fd(2020년 11월 23일)를 참조하십시오.
(주니오 C 하마노에 의해 합병 -- -- 커밋 2aeafbc, 2020년 12월 8일)

usagetrace2 항목 추가warning()

사인 오프 바이: 조나단 탄

항상 trace2 오류 이벤트 발생warning()라고 불리는 것은, 마치 때처럼.die(),error()또는usage()이 호출됩니다.

이렇게 하면 오류가 아니라 경고를 트리거하는 문제를 디버깅하는 데 도움이 됩니다.
특히 $DAYJOB에서 커밋 그래프와 관련하여 발생한 문제를 디버깅하는 데 도움이 되었을 수 있습니다.

잠재적으로 관련성이 있는 메시지를 포함하는 것과 생성된 추적 출력을 혼란스럽게 하는 것 사이에는 절충이 있습니다.
나는 생각합니다.warning()메시지는 추적에 포함되어야 합니다. Git의 특성상 Git 도구의 여러 호출에 사용되며 Git 호출의 실패(현재 추적됨)는 여기에서처럼 경고(현재 추적되지 않음)만 증상으로 갖는 이전 Git 호출의 예상치 못한 상호 작용으로 인해 발생할 수 있기 때문입니다.


Git 2.35(Q1 2022)를 사용하면,exit올바르게 추적됨:

Aévar Arnförd Bjarmason()avar의 커밋 368b584(2021년 12월 7일)를 참조하십시오.
(주니오 C 하마노에 의해 합병 -- -- 67b7017, 2021년 12월 22일 커밋)

common-main.c종료 호출 (), 복귀 안 함

사인 오프 바이: 애바르 아르뇌르드 비야르마손

"return" 문으로 끝나는 대신 "exit()"을 호출하도록 main() 함수를 변경합니다.
exit() 함수는 다음을 호출하는 우리만의 래퍼입니다.trace2_cmd_exit_fl()우리를 위해, 부터:

#define exit(code) exit(trace2_cmd_exit_fl(__FILE__, __LINE__, (code)))

해당 "exit()" 래퍼는 ee4512e 이후로 사용되고 있습니다.trace2새 결합 추적 기능 만들기", 2019-02-22, Gitv2.22.0-rc0 -- 배치 #2에 나열된 병합.

이미 "메인()"의 다운스트림 바로 아래에 코드가 있습니다. 이 코드는 다운스트림의 다양한 "종료()" 호출과 같은 것에 의존합니다."cmd_main()git.c 》에서.


Git 2.36 (Q2220)을 사용하면 추적과 관련하여 진행 API가 더욱 견고합니다.

커밋 b3118a5, 커밋 74900a6, 커밋 accf1eb, 커밋 1ccad6a, 커밋 a02014b, 커밋 bbfb1c2, 커밋 791afae, 커밋 587c3d0, 커밋 8266e0c(2022년 2월 3일) by Aevar Arnfjörd Bjarmason()avar 참조.
(주니오 C 하마노에 의해 합병 -- -- 2022년 2월 25일 47fcfe를 약속함)

progress API통일된stop_progress{,_msg}()trace2 버그 수정

사인 오프 바이: 애바르 아르뇌르드 비야르마손

여기에 9d81ecb와 함께 도입된 잠수함 버그가 있습니다.progress스파스 모드를 추가하여 100% 완료 메시지를 강제로 표시합니다.", 2019-03-21, Git v2.22.0-rc0 -- 배치 #5)에 병합합니다.
"start_sparse_progress()API는 진행이 다음과 같이 종료된 경우에만 올바른 작업을 수행합니다."stop_progress()아닌"stop_progress_msg()".

해당 API의 유일한 사용자는"stop_progress()하지만 여전히 trace2 문제와 함께 만드는 것으로 그것을 해결합시다."stop_progress()을 위한 하찮은 포장지."stop_progress_msg()".

자세한 내용을 추가해 보셨습니까?-v복제 시 운영자?

git clone -v git://git.kernel.org/pub/scm/.../linux-2.6 my2.6

이전 Git 버전(1.8 이전)의 경우

이전 git 및 ssh 버전에서 SSH 디버깅을 활성화할 수 있는 적절한 방법을 찾을없었습니다.저는 환경 변수를 찾아봤습니다.ltrace -e getenv ...작동할 GIT_TRACE 또는 SSH_DEBUG 변수의 조합을 찾을 수 없습니다.

대신 git->ssh 시퀀스에 'ssh -v'를 임시로 주입하는 방법이 있습니다.

$ echo '/usr/bin/ssh -v ${@}' >/tmp/ssh
$ chmod +x /tmp/ssh
$ PATH=/tmp:${PATH} git clone ...
$ rm -f /tmp/ssh

다음은 2013년 2월 11일 github repo 복제를 위해 ssh 버전 OpenSSH_5.3p1, OpenSSL 1.0.1 e-fips를 사용한 git 버전 1.8.3의 출력입니다.

$ (echo '/usr/bin/ssh -v ${@}' >/tmp/ssh; chmod +x /tmp/ssh; PATH=/tmp:${PATH} \
   GIT_TRACE=1 git clone https://github.com/qneill/cliff.git; \
   rm -f /tmp/ssh) 2>&1 | tee log
trace: built-in: git 'clone' 'https://github.com/qneill/cliff.git'
trace: run_command: 'git-remote-https' 'origin' 'https://github.com/qneill/cliff.git'
Cloning into 'cliff'...
OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013
debug1: Reading configuration data /home/q.neill/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Connecting to github.com ...
...
Transferred: sent 4120, received 724232 bytes, in 0.2 seconds
Bytes per second: sent 21590.6, received 3795287.2
debug1: Exit status 0
trace: run_command: 'rev-list' '--objects' '--stdin' '--not' '--all'
trace: exec: 'git' 'rev-list' '--objects' '--stdin' '--not' '--all'
trace: built-in: git 'rev-list' '--objects' '--stdin' '--not' '--all'

Git 2.37(Q3220)과 함께, 새로운bug()그리고.BUG_if_bug()API를 도입하여 "여러 버그를 탐지하고 최종적으로 중단"하는 패턴을 균일하게 기록할 수 있습니다.

이는 git-shell 관련 문제를 디버깅하는 데 사용되는 trace2 출력의 일부입니다.

커밋 6d40f0a, 커밋 07b1d8f, 커밋 5b2f5d9, 커밋 53ca569, 커밋 0cc05b0, 커밋 19d7594(2022년 6월 2일) 참조.avar
(주니오 C 하마노에 의해 합병 -- -- 2022년 6월 10일 커밋 4da14b5에서)

BUG()와 함께 사용할 치명적이지 않은 버그() 함수 usage.c추가

사인 오프 바이: 애바르 아르뇌르드 비야르마손

실행 중인 BUG()를 표시하고 싶지만 무엇이 잘못되었는지 표시하기 위해 더 많은 BUG() 호출자를 축적하고 있을 수 있기 때문에 BUG() 호출을 연기하고 싶은 경우에 사용할 BUG() 함수를 추가합니다.

우리는 이미 코드베이스의 다양한 부분에 이러한 종류의 기능을 가지고 있습니다. 단지 이 새로운 API가 제공하는 기능을 임시로 재발명하는 형태입니다.
예.
이것은 의 optbug()와 의 루프에서 수행하는 'error("BUG:[...]'를 대체하는 데 사용됩니다.

이것이 대체하는 코드와 달리 우리는 이 새로운 bug() 함수(BUG()를 포함한 다른 함수와 마찬가지로)를 사용하여 trace2에 기록할 것이며, bug() 함수 자체가 다양한 sprintf()와 같은 인수를 수용하기 때문에 경우에 따라 xstrfmt()에 대한 호출을 피할 수 있습니다.

버그()에 대한 모든 호출자는 다음을 통해 해당 통화를 추적할 수 있습니다.BUG_if_bug()BUG()가 꺼질 것입니다(즉,
abort() 버그에 대한 이전 통화가 있는 경우 발신자도 통화하지 않기로 결정할 수 있습니다.BUG_if_bug()종료() 시간까지 결과 BUG() 호출을 그대로 둡니다.
현재 호출하지 않는 버그() API 사용자가 없습니다.BUG_if_bug()그들은 포 루프 후에, 그러나 전화를 하지 않는 것을 허용합니다.BUG_if_bug()API를 유연하게 유지합니다.
여기 테스트와 문서에서 알 수 있듯이 우리는 실종된 것을 발견할 것입니다.BUG_if_bug()우리의 출구 포장지에 있는 호출.

technical/api-error-handling이제 관리 페이지에 다음 항목이 포함됩니다.

BUG,bug,die,usage,error,그리고.warning의 오류를 보고합니다.

technical/api-error-handling이제 관리 페이지에 다음 항목이 포함됩니다.

  • bug(소문자 구분 안 함)BUG)는 다음과 같이 사용되어야 합니다.BUG하지만 전화하는 대신 "BUG" 메시지를 출력합니다.abort().

호출:bug()그러면 "진짜" 통화가 발생합니다.BUG()함수(명시적으로 호출)BUG_if_bug()방문 후에bug()또는 암묵적으로exit()우리가 미해결된 것을 만났는지 확인할 시간.bug()호출

이전에 전화가 없었던 경우bug()호출하기 전에BUG_if_bug()후자는 NOOP입니다.BUG_if_bug()함수는 다음과 같은 인수를 사용합니다.BUG()그 자체로부르기BUG_if_bug()분명히 필요하지는 않지만, 가능한 한 빨리 우리가 죽도록 보장합니다.

이전에 전화가 있었다는 것을 알고 있는 경우bug()그때 부르는BUG()그 자체는 부르는 것과 같습니다.BUG_if_bug()후자는 포장지 호출입니다.BUG()만약 우리가 전화를 걸었다는 것을 나타내는 깃발을 세웠다면.bug().

technical/api-trace2이제 관리 페이지에 다음 항목이 포함됩니다.

이 이벤트는 다음 중 하나가 발생할 때 발생합니다.BUG(),bug(),error(),die(),warning()또는usage()함수를 호출합니다.


Git 2.38(Q3220)을 사용하면 런타임에 명령에서 사용하는 구성 값을 인쇄할 수도 있습니다.

Git 2.39(Q4 2022)는 2개의 새로운 제품을 추가합니다.trace2시설, "timer그리고 "counter":

커밋 8107162, 커밋 8ad5756, 커밋 24a4c45, 커밋 3124793, a70839c, 커밋 8e8c5ad, 커밋 5bb925, 커밋 545ddca(Jeff-Hostetler2022년 10월 24일)를 참조하십시오.
(테일러 블라우에 의해 합병됨 -- -- 2022년 10월 30일 위원회 5be3c6에서)

trace2스톱워치 타이머 추가

사인 오프 바이: 제프 호스텔러

타이머는 Trace2 영역의 대안입니다.
영역은 인덱스 읽기 시간, 준비되지 않은 파일 검색 시간, 추적되지 않은 파일 검색 시간 등 다양한 계산 단계에서 소요되는 시간을 측정하는 데 유용합니다.

하지만 지역이 모든 장소에서 적합한 것은 아닙니다.

예를 들어, 체크아웃 중에 영역을 사용하여 프로세스의 전체 수명에서 ODB(Object Database)에서 객체를 부풀리는 데 소요된 총 시간을 측정하는 것은 매우 비효율적입니다.unzip()지역은 출력을 범람시키고 명령을 상당히 느리게 할 것입니다. 그리고 어떤 형태의 후처리는 사용된 시간을 계산하기 위해 필요할 것입니다.unzip().

타이머는 일련의 타이머 간격을 측정하고 단일 요약 이벤트(스레드 및/또는 프로세스 종료 시)를 내보내는 데 사용할 수 있습니다.

technical/api-trace2이제 관리 페이지에 다음 항목이 포함됩니다.

"th_timer"

이 이벤트는 스레드에서 스톱워치 타이머가 실행된 시간을 기록합니다.이 이벤트는 스레드별 이벤트를 요청한 타이머에 대한 스레드가 종료될 때 생성됩니다.

{
"event":"th_timer",
...
"category":"my_category",
"name":"my_timer",
"intervals":5,         # number of time it was started/stopped
"t_total":0.052741,    # total time in seconds it was running
"t_min":0.010061,      # shortest interval
"t_max":0.011648       # longest interval
}

"timer"

이 이벤트는 모든 스레드에서 집계된 스톱워치 타이머 실행 시간을 기록합니다.이 이벤트는 프로세스가 종료될 때 생성됩니다.

{
"event":"timer",
...
"category":"my_category",
"name":"my_timer",
"intervals":5,         # number of time it was started/stopped
"t_total":0.052741,    # total time in seconds it was running
"t_min":0.010061,      # shortest interval
"t_max":0.011648       # longest interval
}

technical/api-trace2이제 관리 페이지에 다음 항목이 포함됩니다.

Stopwatch Timer Events

프로세스의 수명 동안 코드 내 여러 위치에서 호출될 수 있는 함수 호출 또는 코드 범위에 소요된 시간을 측정합니다.

static void expensive_function(void)
{
trace2_timer_start(TRACE2_TIMER_ID_TEST1);
...
sleep_millisec(1000); // Do something expensive
...
trace2_timer_stop(TRACE2_TIMER_ID_TEST1);
}

static int ut_100timer(int argc, const char **argv)
{
...

expensive_function();

// Do something else 1...

expensive_function();

// Do something else 2...

expensive_function();

return 0;
}

이 예제에서는 다음 시간에 소비된 총 시간을 측정합니다.expensive_function()프로그램의 전체 흐름에서 호출되는 시간에 관계없이.

$ export GIT_TRACE2_PERF_BRIEF=1
$ export GIT_TRACE2_PERF=~/log.perf
$ t/helper/test-tool trace2 100timer 3 1000
...
$ cat ~/log.perf
d0 | main                     | version      |     |           |           |              | ...
d0 | main                     | start        |     |  0.001453 |           |              | t/helper/test-tool trace2 100timer 3 1000
d0 | main                     | cmd_name     |     |           |           |              | trace2 (trace2)
d0 | main                     | exit         |     |  3.003667 |           |              | code:0
d0 | main                     | timer        |     |           |           | test         | name:test1 intervals:3 total:3.001686 min:1.000254 max:1.000929
d0 | main                     | atexit       |     |  3.003796 |           |              | code:0

그리고, Git 2.39:

trace2글로벌 카운터 메커니즘 추가

사인 오프 바이: 제프 호스텔러

Trace2에 글로벌 카운터 메커니즘을 추가합니다.

Trace2 카운터 메커니즘은 글로벌 카운터 변수 집합을 생성하는 기능과 효율적으로 증분할 수 있는 API를 추가합니다.
카운터는 선택적으로 모든 스레드의 합계 외에 스레드별 사용량을 보고할 수 있습니다.

스레드가 종료되고 프로세스가 종료될 때 Trace2 로그에 카운터 이벤트가 방출됩니다.

카운터는 의 대안입니다.data그리고.data_json사건들

카운터는 공정의 수명 전반에 걸쳐 측정하고자 하는 경우, 성능상의 이유로 측정당 이벤트를 원하지 않는 경우, 데이터가 영역 내에 편리하게 들어맞지 않는 경우 또는 관리 흐름으로 인해 최종 합계를 쉽게 쓸 수 없는 경우에 유용합니다.
예를 들어, 이를 사용하여 다음에 대한 통화 수를 보고할 수 있습니다.unzip()또는 체크아웃 중에 비활성화된 단계의 수입니다.

technical/api-trace2이제 관리 페이지에 다음 항목이 포함됩니다.

"th_counter"

이 이벤트는 카운터 변수의 값을 스레드에 기록합니다.이 이벤트는 스레드별 이벤트를 요청한 카운터에 대한 스레드가 종료될 때 생성됩니다.

{
"event":"th_counter",
...
"category":"my_category",
"name":"my_counter",
"count":23
}

"counter"

이 이벤트는 모든 스레드에서 카운터 변수의 값을 기록합니다.이 이벤트는 프로세스가 종료될 때 생성됩니다.여기서 보고된 총 값은 모든 스레드의 합계입니다.

{
"event":"counter",
...
"category":"my_category",
"name":"my_counter",
"count":23
}

언급URL : https://stackoverflow.com/questions/6178401/how-can-i-debug-git-git-shell-related-problems

반응형