如何调试git / git-shell相关问题?

时间:2011-05-30 15:58:54

标签: git debugging trace tracing

如何获得有关git / git-shell的调试信息?

我遇到了问题,user1可以毫无问题地克隆存储库,而user2只能克隆一个空存储库。我设置了GIT_TRACE=1,但没有任何有用的信息。

最后,经过长时间的试验和错误,结果证明这是文件的权限问题。适当的错误消息可能会使此问题短路。

8 个答案:

答案 0 :(得分:165)

对于更详细的输出,请使用以下内容:

GIT_CURL_VERBOSE=1 GIT_TRACE=1 git pull origin master

答案 1 :(得分:52)

调试

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用于调试浅层存储库的获取/克隆。

可能的值包括:

  • true12写给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的数量以降低详细程度。

实施例

$ 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
...

答案 2 :(得分:41)

试试这个:

GIT_TRACE=1 git pull origin master

答案 3 :(得分:35)

如果是通过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'。

答案 4 :(得分:17)

Git 2.9.x / 2。10(2016年第3季度)增加了另一个调试选项:GIT_TRACE_CURL

commit 73e57aacommit 74c682dElia 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,特别是完整的传输标头和所有交换的数据有效负载。
  如果特定情况需要更彻底的调试分析,这可能会有用。

The documentation将声明:

GIT_TRACE_CURL
  

启用git传输协议的所有传入和传出数据(包括描述性信息)的卷曲完整跟踪转储。
  这类似于在命令行上执行curl --trace-ascii

     

此选项会覆盖设置GIT_CURL_VERBOSE环境变量。

您可以在this answer中看到这个新选项,也可以在Git 2.11(2016年第4季度)测试中看到:

commit 14e2411commit 81590bfcommit 4527aa1commit 4eee6c6Elia 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

答案 5 :(得分:4)

您是否尝试在克隆时添加详细(-v)运算符?

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

答案 6 :(得分:2)

对于较旧的git版本(1.8及更低版本)

在较旧的git和ssh版本中,我发现没有合适的方法来启用SSH调试。我使用const dbImageItems = [ { _id: 17581, key: "F97E9FEF-D4A7-408C-88BF-BE033F6F3169", reqStatus: "SUCCESS", errorMsg: "", requestDt: "0001-01-01T00:00:00" }, { _id: 17580, key: "C744520A-57CD-461F-B03E-8CC4F8D97CD4", reqStatus: "ERROR", errorMsg: "An error occured", requestDt: "0001-01-01T00:00:00" }] function ImageItem(id, guid, status, errMsg) { this.id = id; this.guid = guid; this.status = status; this.errMsg = errMsg; } export function getImageItems() { let imageItems = []; dbImageItems.forEach(function(value) { const item = new ImageItem( value._id, value.key, value.reqStatus, value.errorMsg ); imageItems.push(item); }); return imageItems; } 查找环境变量,但找不到可以正常使用的GIT_TRACE或SSH_DEBUG变量的任何组合。

下面是将ssh -v临时注入git-> ssh序列的方法:

ltrace -e getenv ...

此处是 git版本1.8.3 和ssh版本 OpenSSH_5.3p1,OpenSSL 1.0.1e-fips的输出,2013年2月11日:克隆github存储库:

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

答案 7 :(得分:1)

Git 2.22(2019年第二季度)引入了 trace2 Jeff Hostetler 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_TR2旨在替代GIT_TRACE和logs命令   摘要数据。

  •   
  • GIT_TR2_PERF旨在替代GIT_TRACE_PERFORMANCE
      它将输出扩展为命令进程,线程,   回购,绝对和相对经过时间。它报告事件   子进程启动/停止,线程启动/停止和每线程功能   嵌套。

  •   
  • GIT_TR2_EVENT是一种新的结构化格式。它将事件数据写为   系列JSON记录。

  •   
     

对trace2函数的调用将记录到启用的3个输出目标中的任何一个,而无需调用不同的trace_printf*trace_performance*例程。

请参见commit a4d3a28Josh Steadmon (steadmon)(2019年3月21日)。
(由Junio C Hamano -- gitster --commit 1b40314中合并,2019年5月8日)

  

trace2:写入目录目标

     

当trace2环境变量的值是引用现有目录的绝对路径时,请将输出写入给定目录下的文件(每个进程一个)。   文件将根据trace2 SID的最终组成部分命名,然后加上一个计数器以避免潜在的冲突。

     

这使得为每次git调用收集跟踪更加方便   通过无条件地将相关的trace2 envvar设置为常量   目录名称。


另请参见commit f672dee(2019年4月29日)以及commit 81567cacommit 08881b9commit bad229acommit 26c6f25commit bce9db6,{{3 }},commit 800a7f9commit a7bc01ecommit 39f4317commit a089724(由commit 1703751创建)(2019年4月15日)。
(由Jeff Hostetler (jeffhostetler)Junio C Hamano -- gitster --中合并,2019年5月13日)

commit 5b2d1c0现在包括new documentation(表示不遵守存储库本地和工作树配置文件以及-c命令行参数。)

config settings which are only read from the system and global config files

$ 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

对于Example

$ 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