web-dev-qa-db-ja.com

git / git-Shell関連の問題をデバッグするにはどうすればよいですか?

どうすればgit/git-shellに関するデバッグ情報を入手できますか?

問題がありました。user1は問題なくリポジトリをクローンできましたが、user2は空のリポジトリのみをクローンできました。 GIT_TRACE=1を設定しましたが、有用なことは何も言われませんでした。

最後に、長い試行錯誤の後、ファイルのアクセス許可の問題であることが判明しました。適切なエラーメッセージがこの問題を回避する可能性があります。

123
Andor

さらに詳細な出力を行うには、次を使用します。

GIT_CURL_VERBOSE=1 GIT_TRACE=1 git pull Origin master

174
WTK

デバッグ

Gitには、Gitの問題のデバッグに使用できるかなり完全なトレースセットが組み込まれています。

それらをオンにするには、次の変数を定義できます。

  • GIT_TRACE一般的なトレースの場合、
  • GIT_TRACE_PACK_ACCESS packfileアクセスのトレース用、
  • GIT_TRACE_PACKETネットワーク操作のパケットレベルのトレース用、
  • GIT_TRACE_PERFORMANCEはパフォーマンスデータを記録します。
  • GIT_TRACE_SETUPは、リポジトリとそれが対話している環境の検出に関する情報、
  • GIT_MERGE_VERBOSITYは、再帰的マージ戦略のデバッグ用(値:0〜5)、
  • GIT_CURL_VERBOSEはすべてのcurlメッセージを記録します(curl -vと同等)、
  • GIT_TRACE_SHALLOWは、浅いリポジトリのフェッチ/クローン作成をデバッグします。

可能な値には次のものがあります。

  • true1、または2はstderrに書き込みます。
  • 指定されたファイルへの出力をトレースするための/で始まる絶対パス。

詳細については、以下を参照してください: Git Internals-Environment Variables


SSH

SSHの問題については、次のコマンドを試してください。

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

または、sshを使用して資格情報を検証します。

ssh -vvvT [email protected]

またはHTTPSポート経由:

ssh -vvvT -p 443 [email protected]

注:冗長レベルを下げるには、-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
...
61
kenorb

これを試してください:

GIT_TRACE=1 git pull Origin master
41
C.C.

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コマンドに使用できます。

35
Basil Musa

Git 2.9.x/2.10(2016年第3四半期)には、別のデバッグオプションGIT_TRACE_CURLが追加されています。

commit 73e57aacommit 74c682d (2016年5月23日)by Elia Pinto(devzero2000
支援者: TorstenBögershausen(tboegi 、Ramsay Jones、 Junio C Hamano(gitsterエリックサンシャイン(sunshineco 、および ジェフキング(peff
Jumio C Hamano-gitster- in commit 2f84df2 、2016年7月6日)

http.cGIT_TRACE_CURL環境変数を実装します

GIT_TRACE_CURL環境変数を実装して、GIT_CURL_VERBOSEの詳細度、特に完全なトランスポートヘッダーと交換されるすべてのデータペイロードを許可します。
特定の状況で、より徹底的なデバッグ分析が必要になる場合に役立ちます。

ドキュメント には次のように記載されています。

GIT_TRACE_CURL

Gitトランスポートプロトコルの記述情報を含む、すべての着信および発信データの完全なカールトレースダンプを有効にします。
これは、コマンドラインでcurl --trace-asciiを実行することに似ています。

このオプションは、GIT_CURL_VERBOSE環境変数の設定をオーバーライドします。


新しいオプションは this answer で使用されていますが、Git 2.11(2016年第4四半期)テストでも使用されています。

commit 14e2411commit 81590bfcommit 4527aa1commitを参照4eee6c6 (2016年9月7日)by Elia Pinto(devzero2000
浜野順夫-gitster- in commit 930b67e 、2016年9月12日)

deprecatedGIT_TRACE_CURLの代わりに、新しいGIT_CURL_VERBOSE環境変数を使用します。

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

クローンを作成するときに冗長(-v)演算子を追加しようとしましたか?

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

4
JamesHalsall

古いgitバージョン(1.8以前)

古いgitバージョンとsshバージョンではSSHデバッグを有効にする適切な方法がありませんが見つかりました。 ltrace -e getenv ...を使用して環境変数を探しましたが、動作するGIT_TRACEまたはSSH_DEBUG変数の組み合わせが見つかりませんでした。

代わりに、「ssh -v」をgit-> sshシーケンスに一時的に注入するレシピを次に示します。

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

gitバージョン1.8. sshバージョンの出力OpenSSH_5.3p1、OpenSSL 1.0.1e-fips 11 Feb 201 githubリポジトリのクローン:

$ (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'
1
qneill

Git 2.22(2019年第2四半期)では、trace2を導入し、 commit ee4512e byJeff Hostetler

trace2:新しい複合トレース機能の作成

Git用の新しい統合トレース機能を作成します。
最終的な目的は、現在のtrace_printf*ルーチンとtrace_performance*ルーチンを、git_trace2*ルーチンの統合セットに置き換えることです。

通常のprintfスタイルのAPIに加えて、trace2は、構造化データの書き込みを可能にする固定フィールドを持つより高いレベルのイベント動詞を提供します。
これにより、外部ツールのポスト処理と分析が容易になります。

Trace2は3つの出力ターゲットを定義します。
これらは、環境変数「GIT_TR2」、「GIT_TR2_PERF」、および「GIT_TR2_EVENT」を使用して設定されます。
これらは「1」または絶対パス名(現在のGIT_TRACEのように)に設定できます。

注:環境変数名に関しては、GIT_TRACExxxではなく、常にGIT_TRxxxを使用してください。
したがって、実際にはGIT_TRACE2GIT_TRACE2_PERFまたはGIT_TRACE2_EVENTです。
後述のGit 2.22の名前変更を参照してください。

以下は、old環境変数名を使用した、この新しいトレース機能でのinitialの動作です。

  • GIT_TR2は、GIT_TRACEの代わりになることを意図しており、コマンドの要約データを記録します。

  • GIT_TR2_PERFは、GIT_TRACE_PERFORMANCEの代替として意図されています。
    コマンドプロセス、スレッド、レポ、絶対経過時間、相対経過時間の列で出力を拡張します。子プロセスの開始/停止、スレッドの開始/停止、およびスレッドごとの関数のネストのイベントを報告します。

  • GIT_TR2_EVENTは新しい構造化形式です。イベントデータを一連のJSONレコードとして書き込みます。

Trace2関数の呼び出しは、異なるtrace_printf*またはtrace_performance*ルーチンを呼び出すことなく、有効になっている3つの出力ターゲットのいずれかにログを記録します。

Josh Steadmon(steadmon による commit a4d3a28 (2019年3月21日)を参照してください。
浜野順夫-gitster- in commit 1b40314 、2019年5月8日)

trace2:ディレクトリターゲットへの書き込み

Trace2環境変数の値が既存のディレクトリを参照する絶対パスである場合、指定されたディレクトリの下のファイル(プロセスごとに1つ)に出力を書き込みます。
trace2 SIDの最終コンポーネントに従ってファイルに名前が付けられ、その後に潜在的な衝突を回避するためのカウンターが続きます。

これにより、関連するtrace2 envvarを一定のディレクトリ名に無条件に設定することにより、すべてのgit呼び出しのトレースを収集するのがより便利になります。


commit f672dee (2019年4月29日)、および commit 81567cacommit 08881b9commit bad229aも参照commit 26c6f25commit bce9db6commit 800a7f9commit a7bc01ecommit 39f4317commit a089724commit 1703751 (2019年4月15日)by Jeff Hostetler(jeffhostetler
浜野淳夫-gitster- in commit 5b2d1c0 、2019年5月13日)

new documentation には、システムおよびグローバル設定ファイルからのみ読み込まれる config設定が含まれるようになりました (つまり、リポジトリのローカルおよびワークツリーの設定ファイルと-cコマンドライン引数は尊重されません。)

Example

$ 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

performance measure の場合:

$ 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四半期)で文書化されているように、使用する環境変数はGIT_TRACE2です。

Carlo Marcelo ArenasBelón(carenas による commit 6114a40 (2019年6月26日)を参照してください。
ÆvarArnfjörðBjarmason(avar による commit 3efa1c6 (2019年6月12日)を参照してください。
Jumio C Hamano-gitster- in commit e9eaaa4 、2019年7月9日)

これは、Git 2.22で行われた作業に従います: commit 4e0d3aacommit e4b75d6 (2019年5月19日)by SZEDERGábor(szeder
C浜野順夫-gitster- in commit 463dca6 、2019年5月30日)

trace2:環境変数の名前をGIT_TRACE2 *に変更

ユーザーが設定することになっている環境変数の場合、GIT_TR2* env変数はあまりにも不明確で、一貫性がなく、見苦しいです。

確立されたGIT_*環境変数のほとんどは省略形を使用しません。また、いくつかの場合(GIT_DIRGIT_COMMON_DIRGIT_DIFF_OPTS)は省略形(DIRおよびOPTS)の略です。
しかし、TRは何を表していますか?追跡、従来、トレーラー、トランザクション、転送、変換、移行、翻訳、移植、トランスポート、トラバーサル、ツリー、トリガー、切り捨て、信頼、または...?!

Trace2機能は、その名前の接尾辞「2」が示すように、最終的にGitの元のトレース機能に取って代わります。
対応する環境変数がそれに続き、元のGIT_TRACE変数の後、それらはGIT_TRACE2と呼ばれることを期待するのは合理的です。 「GIT_TR」というようなものはありません。

すべてのtrace2固有の構成変数は、非常に賢明なことに、「trace2」ではなく「tr2」セクションにあります。

OTOHこれらの環境変数の名前から「トレース」の最後の3文字を省略しても、何も得られません

したがって、すべてのGIT_TR2*環境変数の名前をGIT_TRACE2*に変更してから、安定したリリースに移行してください。

1
VonC