如何调试git / git-shell相关问题?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何调试git / git-shell相关问题?相关的知识,希望对你有一定的参考价值。
我如何获得有关git / git-shell的一些调试信息?
我有一个问题,user1
可以毫无问题地克隆存储库,而user2
只能克隆一个空存储库。我设置了GIT_TRACE=1
,但没有任何有用的东西被告知。
最后,经过长时间的反复试验,结果证明这是文件的权限问题。适当的错误消息可能会使此问题短路。
对于更详细的输出使用如下:
GIT_CURL_VERBOSE=1 GIT_TRACE=1 git pull origin master
Debugging
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 -v
),GIT_TRACE_SHALLOW
用于调试浅层存储库的获取/克隆。
可能的值包括:
true
,1
或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 git@github.com
或通过HTTPS端口:
ssh -vvvT -p 443 git@ssh.github.com
注意:减少-v
的数量以减少详细程度。
Examples
$ 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 multi_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命令,而不仅仅是'git clone'。
Git 2.9.x / 2.10(2016年第3季度)增加了另一个调试选项:GIT_TRACE_CURL
。
请参阅commit 73e57aa撰写的commit 74c682d,Elia Pinto (devzero2000
)(2016年5月23日)。
帮助:Torsten Bögershausen (tboegi
),拉姆齐琼斯,Junio C Hamano (gitster
),Eric Sunshine (sunshineco
)和Jeff King (peff
)。
(由Junio C Hamano -- gitster
--合并于commit 2f84df2,2016年7月6日)
http.c
:实现GIT_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 14e2411,commit 81590bf,commit 4527aa1,commit 4eee6c6,Elia Pinto (devzero2000
)(2016年9月7日)。
(由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
您是否尝试在克隆时添加详细(-v
)运算符?
git clone -v git://git.kernel.org/pub/scm/.../linux-2.6 my2.6
Git 2.22(2019年第二季度)由Jeff Hostetler介绍trace2
和commit ee4512e:
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_TRACE2
,GIT_TRACE2_PERF
或GIT_TRACE2_EVENT
。
请参阅下面提到的Git 2.22重命名。
接下来是这个新的跟踪功能的初始工作,旧的环境变量名称:
GIT_TR2
旨在替代GIT_TRACE
和日志命令摘要数据。GIT_TR2_PERF
旨在替代GIT_TRACE_PERFORMANCE
。 它使用列扩展输出,包括命令进程,线程,repo,绝对和相对经过时间。它报告子进程启动/停止,线程启动/停止和每线程函数嵌套的事件。GIT_TR2_EVENT
是一种新的结构化格式。它将事件数据写为一系列JSON记录。调用trace2函数会记录到启用的3个输出目标中的任何一个,而无需调用不同的
trace_printf*
或trace_performance*
例程。
见commit a4d3a28的Josh Steadmon ( 以上是关于如何调试git / git-shell相关问题?的主要内容,如果未能解决你的问题,请参考以下文章steadmon
)(2019年3月21日)。
(由Junio C Hamano -- gitster
--合并于commit 1b403