为什么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知道您希望阶段(添加到索引)删除foogit-rm
是一种方式,git-add-A
是另一种方式,git-add-i
是另一种方式。事实上,这是exac