2

git status在以交互方式为重命名的文件添加补丁后,我在输出中意外出现“dev/null” 。我想知道这是否是预期的,并且这种行为是否有充分的理由,或者这可能是一个错误。

以下是如何重现此内容的简单说明。在我的现实世界场景中,它有点复杂,我使用 是有充分理由的git add -p,但我能够将其归结为这个最小的例子:

$ git初始化测试
在 /local_disk/tmp/test/.git/ 中初始化空 Git 存储库
$ cd 测试
$ echo "foo" > foo
$ git 添加 foo
$ git commit -m '添加 foo'
[master (root-commit) 3643b5d] 添加 foo
 1 个文件已更改,1 个插入(+),0 个删除(-)
 创建模式 100644 foo
$ mv 富吧
$ git添加-p
差异 --git a/foo b/foo
索引 257cc56..0000000
--- a/foo
+++ /dev/null
@@ -1 +0,0 @@
-foo
上演这个大块 [y,n,q,a,d,/,e,?]?是的

$ 混帐状态
# 在分支master上
# 要提交的更改:
# (使用“git reset HEAD ...”取消暂存)
#
# 新文件:dev/null
# 删除:foo
#
# 已更改但未更新:
# (使用 "git add/rm ..." 更新将要提交的内容)
# (使用 "git checkout -- ..." 丢弃工作目录中的更改)
#
# 删除:dev/null
#
# 未跟踪的文件:
# (使用“git add ...”来包含将要提交的内容)
#
# 酒吧

“新文件:dev/null”和“已删除文件:dev/null”是什么?我希望这会产生与我所做的完全相同的事情:

$ mv 富吧
$ git rm foo
$ 混帐状态
# 在分支master上
# 要提交的更改:
# (使用“git reset HEAD ...”取消暂存)
#
# 删除:foo
#
# 未跟踪的文件:
# (使用“git add ...”来包含将要提交的内容)
#
# 酒吧

我正在使用 Git 版本 1.6.5.5,并且还在 1.6.5.4 中复制了它。我无法在具有版本 1.6.1.2 的 Git 的 Cygwin 环境中重现它。

4

1 回答 1

2

正如 thenduks 所提到的,您不应该尝试git add删除文件。 git add新文件,git rm旧文件(或git mv old new采取简单的方法)。另一方面,git 应该要么抱怨你在做什么,要么不感到困惑,并尝试添加一个不存在的 dev/null 文件。

更新
git add -p确实是暂存文件删除的有效方法,但看起来git apply在修复不同的错误时引入了git apply 错误

更新
我可以使用 1.6.1.2 在 Linux 上重现它,因此 cygwin git 可能与正常行为不同。在这种情况下,前面提到的错误修复可能没有引入这种行为,并且工作git add -p可能特定于 cygwin 的 git。我一直在试图平分以找到git add -p开始失败的地方。

更新事实证明,这是Jeff King 为其提出补丁
的交互方面的一个错误。git add

于 2009-12-07T19:04:17.767 回答