我有一个旧的提交 A。我现在处于提交 B=HEAD!=A,并且想将我的工作目录的状态(包括未跟踪的文件)与 A 进行比较。
原因是当前未跟踪的文件是 commit 的一部分A,因此它们不会出现在我想要的差异中,因此不会混乱。
作为一种解决方法,我可以git add <all the untracked files>在差异之前和git reset <all the untracked files>之后手动进行。但是,有许多未跟踪的文件,我想以最大程度的原子性和健壮性的方式执行此操作,因为我正在脚本中执行所有这些操作。
编辑:这个问题还涉及与未跟踪文件的差异。但是,那里的答案需要手动添加并稍后删除未跟踪的文件,我更喜欢一种更自动且以原子方式执行此操作的解决方案,该解决方案可以防止脚本上下文中的中断发生错误。接受的答案正是这样做的,并且确实与链接问题的答案不同。
正如其他人所建议的,您可以使用git add -N向索引添加虚拟条目。跑步:
git diff <hash>\nRun Code Online (Sandbox Code Playgroud)\n\n然后将给定的工作树与当前的工作树进行比较,使用现有索引(现在具有未跟踪文件的条目)来决定要与给定的比较哪些工作树版本<hash>(<hash>可能是提交 ID 或树 ID,或分支名称,或 Git 可以解析为树的任何内容)。但这确实会扰乱索引,正如您所说,您:
\n\n\n希望以最大原子性和鲁棒性的方式做到这一点
\n
诀窍是使用临时的索引。
\n\n这里的初始提交有文件bar和foo;第二次提交已foo删除文件。当前的工作树已经foo复活并且有一个新文件,如图所示git status --short。
$ git log --all --decorate --oneline --graph\n* 11b241c (HEAD -> master) remove foo\n* 8527327 initial\n$ git status --short\nA diffscript\nA foo\nRun Code Online (Sandbox Code Playgroud)\n\n请注意,初始提交是8527327,这是我们传递给的diffscript,这是我们作为参数
$ ./diffscript 8527327\ndiff --git a/diffscript b/diffscript\nnew file mode 100755\nindex 0000000..8d5c978\n--- /dev/null\n+++ b/diffscript\n@@ -0,0 +1,6 @@\n+#! /bin/sh\n+export GIT_INDEX_FILE=$(mktemp) || exit\n+rm -f $GIT_INDEX_FILE\n+trap "rm -f $GIT_INDEX_FILE" 0 1 2 3 15\n+git add -A\n+git diff ${1:-HEAD}\nindex 3ec370c..d319048 100644\n--- a/foo\n+++ b/foo\n@@ -1 +1 @@\n-I am a foo\n+I was foo, am now resurrected\nRun Code Online (Sandbox Code Playgroud)\n\n这diffscript默认与 进行比较HEAD。因此,如果我们不带参数运行它,我们会将提交11b241c与索引/工作树进行比较(因为我们git add -A与索引或工作树进行比较并不重要,在这一点上:它们本质上是相同的,模数.gitignore指令)。
该trap ...行确保我们删除临时索引,无论脚本是由 ^C (信号 2,SIGINT)终止,还是网络断开(信号 1,SIGHUP)或 QUIT(信号 3,SIGQUIT)或 TERMINATE(信号 15, SIGTERM),或者只是正常退出(0,不是信号,只是正常终止)。
令人烦恼的是,Git 坚持认为该文件要么根本不存在,要么具有索引文件签名\xe2\x80\x94不允许空文件\xe2\x80\x94 mktemp,因此我们删除临时文件,以便该git add步骤可以创建它有正确的签名。
| 归档时间: |
|
| 查看次数: |
1803 次 |
| 最近记录: |