【问题标题】:Why does git show "dev/null" in status after interactive add of renamed file?为什么在交互式添加重命名文件后git在状态中显示“dev/null”?
【发布时间】:2010-12-24 03:04:59
【问题描述】:

在以交互方式为重命名的文件添加补丁后,我在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 ...”来包含将要提交的内容) # # 酒吧

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

【问题讨论】:

  • 什么版本的git?我不能重复这种行为。而是在 git mv 响应后 git add -p: no changes
  • @William:使用git mv 是不等价的,因为它同时移动和添加文件。我只使用普通的mv 移动文件,然后使用git add -p 添加它。
  • @Dan,为什么? git mv 是更改文件名的“正确”方式。要删除您使用 git rm 的文件并移动您使用 git mv 的文件,不要只是自己移动文件并期望 git 读取您的想法:)
  • @thenduks:我不相信这是真的。 git mv,如果我没记错的话,是为了安抚那些吵着要这样命令的人群。它不会做任何简单地移动文件然后添加它会做的事情。 git,事实上,确实读懂了你的想法(好吧,实际上它会检查差异并自行识别重命名)。 Git 不需要,或者想要,你告诉它这些事情。
  • 多次阅读您的示例,每次查看“mv foo bar”时,我都会阅读“git mv foo bar”。奇怪的。无论如何,作为一种解决方法,如果你在运行 add -p 后调用“git add dev/null”,你会得到你想要的行为。

标签: git interactive git-add


【解决方案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 开始失败的地方。

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

【讨论】:

  • 就像我在问题中所说的,这是一个简化的“简化”示例。在我的实际场景中,使用了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 知道您想要暂存(add 到索引)删除 foo。 git rm 是一种方式,git add -A 是另一种方式,git add -i 是另一种方式。事实上,这正是 所有 git add 命令的变体所做的。我敢肯定,如果您查看 git addgit rm,您可能会发现它们在瓷器下面使用相同的管道。
  • 除了当您执行git add unknownfile 时,您会收到有关未知路径规范的错误。当已知文件已从工作副本中删除时,情况并非如此。
猜你喜欢
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 2012-11-04
  • 1970-01-01
  • 2020-05-17
  • 2017-10-31
  • 2016-01-26
  • 1970-01-01
相关资源
最近更新 更多