我怎么能有一些关于git/git-shell的调试信息?
我遇到了一个问题,user1可以毫无问题地克隆一个存储库,而user2只能克隆一个空的存储库。我设置了GIT_TRACE=1,但是没有任何有用的提示。
最后,经过长时间的尝试和错误,发现这是一个文件的权限问题。适当的错误消息可以避免此问题。
我怎么能有一些关于git/git-shell的调试信息?
我遇到了一个问题,user1可以毫无问题地克隆一个存储库,而user2只能克隆一个空的存储库。我设置了GIT_TRACE=1,但是没有任何有用的提示。
最后,经过长时间的尝试和错误,发现这是一个文件的权限问题。适当的错误消息可以避免此问题。
当前回答
在Git 2.37 (Q3 2022)中,引入了一个新的bug()和BUG_if_bug() API,以便更容易地统一记录“检测多个错误并最终中止”模式。
这将是trace2输出的一部分,用于调试git-shell相关的问题。
参见 Ævar Arnfjörð Bjarmason (avar) 的提交 6d40f0a、提交 07b1d8f、提交 5b2f5d9、提交 53ca569、提交 0cc05b0、提交 19d7594(2022 年 6 月 2 日)。 (由 Junio C Hamano -- gitster -- 合并于 提交 4da14b5,2022 年 6 月 10 日)
usage.c:添加一个非致命的bug()函数来配合bug() 署名:Ævar Arnfjörð Bjarmason
Add a bug() function to use in cases where we'd like to indicate a runtime BUG(), but would like to defer the BUG() call because we're possibly accumulating more bug() callers to exhaustively indicate what went wrong. We already have this sort of facility in various parts of the codebase, just in the form of ad-hoc re-inventions of the functionality that this new API provides. E.g. this will be used to replace optbug() in parse-options.c, and the 'error("BUG:[...]' we do in a loop in builtin/receive-pack.c. Unlike the code this replaces we'll log to trace2 with this new bug() function (as with other usage.c functions, including BUG()), we'll also be able to avoid calls to xstrfmt() in some cases, as the bug() function itself accepts variadic sprintf()-like arguments. Any caller to bug() can follow up such calls with BUG_if_bug(), which will BUG() out (i.e. abort()) if there were any preceding calls to bug(), callers can also decide not to call BUG_if_bug() and leave the resulting BUG() invocation until exit() time. There are currently no bug() API users that don't call BUG_if_bug() themselves after a for-loop, but allowing for not calling BUG_if_bug() keeps the API flexible. As the tests and documentation here show we'll catch missing BUG_if_bug() invocations in our exit() wrapper.
技术/api错误处理现在包括在它的手册页:
的BUG、BUG、死亡、使用、错误和警告报告错误
技术/api错误处理现在包括在它的手册页:
bug (lower-case, not BUG) is supposed to be used like BUG but prints a "BUG" message instead of calling abort(). A call to bug() will then result in a "real" call to the BUG() function, either explicitly by invoking BUG_if_bug() after call(s) to bug(), or implicitly at exit() time where we'll check if we encountered any outstanding bug() invocations. If there were no prior calls to bug() before invoking BUG_if_bug() the latter is a NOOP. The BUG_if_bug() function takes the same arguments as BUG() itself. Calling BUG_if_bug() explicitly isn't necessary, but ensures that we die as soon as possible. If you know you had prior calls to bug() then calling BUG() itself is equivalent to calling BUG_if_bug(), the latter being a wrapper calling BUG() if we've set a flag indicating that we've called bug().
Technical /api-trace2现在在它的手册页中包括:
当BUG()、BUG()、error()、 调用Die()、warning()或usage()函数。
使用Git 2.38 (Q3 2022),您甚至可以打印命令在运行时使用的配置值。
其他回答
Git 2.9.x/2.10(2016年Q3)增加了另一个调试选项:GIT_TRACE_CURL。
参见Elia Pinto (devzero2000)的commit 73e57aa, commit 74c682d(2016年5月23日)。 帮助:Torsten Bögershausen (tboegi), Ramsay Jones ramsay@ramsayjones.plus.com, Junio C Hamano (gitster), Eric Sunshine (sunshineco),和Jeff King (peff)。 (由Junio C Hamano—gitster—在提交2f84df2中合并,2016年7月6日)
c:实现GIT_TRACE_CURL环境变量
实现GIT_TRACE_CURL环境变量,以允许更详细地了解GIT_CURL_VERBOSE,特别是完整的传输报头和交换的所有数据有效负载。 如果某个特定的情况需要更彻底的调试分析,那么它可能会很有用。
该文件将说明:
GIT_TRACE_CURL 启用所有传入和传出数据的curl完整跟踪转储,包括git传输协议的描述性信息。 这类似于在命令行上执行curl——trace-ascii。 该选项将覆盖设置GIT_CURL_VERBOSE环境变量。
你可以在这个答案中看到这个新选项,在Git 2.11(2016年Q4)测试中也有使用:
参见Elia Pinto (devzero2000)的commit 14e2411, commit 81590bf, commit 4527aa1, commit 4eee6c6(2016年9月07日)。 (由Junio C Hamano—gitster—在commit 930b67e中合并,2016年9月12日)
请使用新的GIT_TRACE_CURL环境变量 已弃用的GIT_CURL_VERBOSE。
GIT_TRACE_CURL=true git clone --quiet $HTTPD_URL/smart/repo.git
请注意,并非所有命令都必须发出跟踪。 例如:你需要Git 2.32 (Q2 2021)才能让reflog失效机制发出跟踪事件。
参见hanwen Nienhuys提交的34c3199(2021年4月23日)。 (由Junio C Hamano—gitster—在commit a850356中合并,2021年5月7日)
参考/调试:跟踪到reflog到期 签署人:Han-Wen Nienhuys
使用Git 2.39 (Q4 2022),在GIT_CURL_VERBOSE和其他文件中编校cURL的h2h3模块的头文件。
参见Glen Choo (chooglen)提交的b637a41(2022年11月11日)。 参见Jeff King (peff)提交73c49a4(2022年11月11日)。 (由Junio C Hamano—gitster—在commit 6adf170中合并,2022年11月23日)
Http:在info中编辑curl h2h3头文件 资助人:杰夫·金 署名:Glen Choo 署名:泰勒·布劳
With GIT_TRACE_CURL=1 or GIT_CURL_VERBOSE=1, sensitive headers like "Authorization" and "Cookie" get redacted. However, since curl/curl commit f8c3724, curl's h2h3 module (invoked when using HTTP/2) also prints headers in its "info", which don't get redacted. For example, 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 produces output like: 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> Teach http.c to check for h2h3 headers in info and redact them using the existing header redaction logic. This fixes the broken redaction logic that we noted in the previous commit, so mark the redaction tests as passing under HTTP2.
您是否尝试在克隆时添加详细(-v)操作符?
Git克隆-v Git://git.kernel.org/pub/scm/.../linux-2.6 my2.6
试试这个:
GIT_TRACE=1 git pull origin master
在Git 2.37 (Q3 2022)中,引入了一个新的bug()和BUG_if_bug() API,以便更容易地统一记录“检测多个错误并最终中止”模式。
这将是trace2输出的一部分,用于调试git-shell相关的问题。
参见 Ævar Arnfjörð Bjarmason (avar) 的提交 6d40f0a、提交 07b1d8f、提交 5b2f5d9、提交 53ca569、提交 0cc05b0、提交 19d7594(2022 年 6 月 2 日)。 (由 Junio C Hamano -- gitster -- 合并于 提交 4da14b5,2022 年 6 月 10 日)
usage.c:添加一个非致命的bug()函数来配合bug() 署名:Ævar Arnfjörð Bjarmason
Add a bug() function to use in cases where we'd like to indicate a runtime BUG(), but would like to defer the BUG() call because we're possibly accumulating more bug() callers to exhaustively indicate what went wrong. We already have this sort of facility in various parts of the codebase, just in the form of ad-hoc re-inventions of the functionality that this new API provides. E.g. this will be used to replace optbug() in parse-options.c, and the 'error("BUG:[...]' we do in a loop in builtin/receive-pack.c. Unlike the code this replaces we'll log to trace2 with this new bug() function (as with other usage.c functions, including BUG()), we'll also be able to avoid calls to xstrfmt() in some cases, as the bug() function itself accepts variadic sprintf()-like arguments. Any caller to bug() can follow up such calls with BUG_if_bug(), which will BUG() out (i.e. abort()) if there were any preceding calls to bug(), callers can also decide not to call BUG_if_bug() and leave the resulting BUG() invocation until exit() time. There are currently no bug() API users that don't call BUG_if_bug() themselves after a for-loop, but allowing for not calling BUG_if_bug() keeps the API flexible. As the tests and documentation here show we'll catch missing BUG_if_bug() invocations in our exit() wrapper.
技术/api错误处理现在包括在它的手册页:
的BUG、BUG、死亡、使用、错误和警告报告错误
技术/api错误处理现在包括在它的手册页:
bug (lower-case, not BUG) is supposed to be used like BUG but prints a "BUG" message instead of calling abort(). A call to bug() will then result in a "real" call to the BUG() function, either explicitly by invoking BUG_if_bug() after call(s) to bug(), or implicitly at exit() time where we'll check if we encountered any outstanding bug() invocations. If there were no prior calls to bug() before invoking BUG_if_bug() the latter is a NOOP. The BUG_if_bug() function takes the same arguments as BUG() itself. Calling BUG_if_bug() explicitly isn't necessary, but ensures that we die as soon as possible. If you know you had prior calls to bug() then calling BUG() itself is equivalent to calling BUG_if_bug(), the latter being a wrapper calling BUG() if we've set a flag indicating that we've called bug().
Technical /api-trace2现在在它的手册页中包括:
当BUG()、BUG()、error()、 调用Die()、warning()或usage()函数。
使用Git 2.38 (Q3 2022),您甚至可以打印命令在运行时使用的配置值。
调试
Git有一个相当完整的嵌入式跟踪集,您可以使用它来调试Git问题。
要打开它们,你可以定义以下变量:
GIT_TRACE for general traces, GIT_TRACE_PACK_ACCESS for tracing of packfile access, GIT_TRACE_PACKET for packet-level tracing for network operations, GIT_TRACE_PERFORMANCE for logging the performance data, GIT_TRACE_SETUP for information about discovering the repository and environment it’s interacting with, GIT_MERGE_VERBOSITY for debugging recursive merge strategy (values: 0-5), GIT_CURL_VERBOSE for logging all curl messages (equivalent to curl -v), GIT_TRACE_SHALLOW for debugging fetching/cloning of shallow repositories.
可能的值包括:
True, 1或2写入stderr, 以/开头的绝对路径,用于跟踪到指定文件的输出。
更多详细信息,请参见: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
...