为什么git在交互式添加重命名文件后会在状态中显示“dev / null”?

时间:2009-12-07 18:15:04

标签: git interactive git-add

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

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

$ git init test
Initialized empty Git repository in /local_disk/tmp/test/.git/
$ cd test
$ echo "foo" > foo
$ git add foo
$ git commit -m 'Add foo'
[master (root-commit) 3643b5d] Add foo
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 foo
$ mv foo bar
$ git add -p
diff --git a/foo b/foo
index 257cc56..0000000
--- a/foo
+++ /dev/null
@@ -1 +0,0 @@
-foo
Stage this hunk [y,n,q,a,d,/,e,?]? y

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#       new file:   dev/null
#       deleted:    foo
#
# Changed but not updated:
#   (use "git add/rm ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#       deleted:    dev/null
#
# Untracked files:
#   (use "git add ..." to include in what will be committed)
#
#       bar

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

$ mv foo bar
$ git rm foo
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#       deleted:    foo
#
# Untracked files:
#   (use "git add ..." to include in what will be committed)
#
#       bar

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

1 个答案:

答案 0 :(得分:1)

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

<强>更新
git add -p确实是用于暂存文件删除的有效方法,但在修复其他git apply bug时,git apply似乎会引入错误。

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

<强>更新
事实证明这是git add的互动方面的一个错误,Jeff King已经提出patches