为什么git会显示;dev/null";交互式添加重命名文件后是否处于状态?

为什么git会显示;dev/null";交互式添加重命名文件后是否处于状态?,git,interactive,git-add,Git,Interactive,Git Add,在以交互方式为重命名的文件添加修补程序后,我在我的git状态输出中意外地出现了“dev/null”。我想知道这是否是意料之中的,这种行为是否有充分的理由,或者这是否可能是一个bug 下面是如何重现这一点的简单说明。在我的真实场景中,它有点复杂,我之所以使用git add-p,有一个很好的理由,但我能够将其归结为这个最小的示例: $ git init test Initialized empty Git repository in /local_disk/tmp/test/.git/ $ cd t

在以交互方式为重命名的文件添加修补程序后,我在我的
git状态
输出中意外地出现了“dev/null”。我想知道这是否是意料之中的,这种行为是否有充分的理由,或者这是否可能是一个bug

下面是如何重现这一点的简单说明。在我的真实场景中,它有点复杂,我之所以使用
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 $git初始化测试 已在/local_disk/tmp/test/.Git中初始化空Git存储库/ $cd测试 $echo“foo”>foo $git添加foo $git commit-m'Add foo' [master(root提交)3643b5d]添加foo 1个文件已更改,1个插入(+),0个删除(-) 创建模式100644 foo $mv富吧 $git add-p diff——git a/foo b/foo 索引257cc56..0000000 ---阿福 +++/dev/null @@ -1 +0,0 @@ -福 把这个大块头[y,n,q,a,d,/,e,,]?Y $git状态 #论分行行长 #要提交的更改: #(使用“git重置磁头…”取消分级) # #新文件:dev/null #已删除:foo # #已更改但未更新: #(使用“git add/rm…”更新将提交的内容) #(使用“git签出--…”放弃工作目录中的更改) # #已删除:dev/null # #未跟踪的文件: #(使用“git add…”包含在将提交的内容中) # #酒吧 “新文件: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 $mv富吧 $git rm foo $git状态 #论分行行长 #要提交的更改: #(使用“git重置磁头…”取消分级) # #已删除:foo # #未跟踪的文件: #(使用“git add…”包含在将提交的内容中) # #酒吧
我正在使用Git版本1.6.5.5,并在1.6.5.4中复制了它。我无法在我的Cygwin环境中复制它,该环境的Git版本为1.6.1.2。

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

更新
git add-p
确实是一种有效的文件删除阶段方法,但在修复不同的
git apply
时,它看起来像是在
git apply
中引入了一个bug

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

更新

原来这是Jeff King提出的git add的交互方面的一个bug。

git的哪个版本?我不能重复那种行为。相反,git mv响应后的git add-p是:nochanges@William:使用
git mv
是不等效的,因为它同时移动和添加文件。我只是用普通的
mv
移动文件,然后用
git add-p
添加它。@Dan,为什么
gitmv
是更改文件名的“正确”方式。要删除您使用的
git-rm
文件并移动您使用的
git-mv
文件,请不要自己移动文件并期望git阅读您的想法:)@thenduks:我不相信这是真的<如果我没有弄错的话,添加code>gitmv
,是为了安抚那些叫嚣着要这样一个命令的人群。它不做任何简单地移动文件,然后添加它可以做的事情。事实上,git确实能读懂你的心思(实际上,它会自己检查差异并识别重命名)。Git不需要,也不想,你告诉它这些事情。把你的例子读很多遍,每次我看“mv foo bar”,我都读“Git mv foo bar”。古怪的无论如何,作为一种解决方法,如果在运行add-p之后调用'git add dev/null',您将获得所需的行为。在我的真实场景中,使用了git add-p,因为它有点复杂(有些更改我想进行,有些我不想)。Git通常允许使用
Git add-p
来“删除”内容
git rm
不需要这样做,它只是一种方便的方式,告诉git您想将一个(不再存在的)文件“添加到删除”到索引中。如果这样做是不正确的,那么
git add-p
不会提供删除内容的修补程序。换句话说,假设我删除了100个文件,但我只想删除其中50个
git add-p
是一种非常方便的方式,可以快速说出“y”/“n”并浏览文件列表,以选择提交时应该进行哪些删除。
git rm
需要进行文件删除。您可以通过尝试执行git add deletedFile来验证这一点。什么也没发生。这就是为什么我说当您使用git add-p进行文件删除时,它应该抱怨或者什么都不做
git mv
确实是一个方便的命令,但是
git rm
不是。如果foo已被删除,则无法
git add foo
的原因是foo不再是文件系统中的文件,因此git无法知道您正在尝试做什么(即,您是否键入了错误的文件名?)。但是,还有其他方法可以让Git知道您希望阶段(添加到索引)删除foo
git-rm
是一种方式,
git-add-A
是另一种方式,
git-add-i
是另一种方式。事实上,这是exac