是否有git
命令添加git diff <file>
的输出不为空的所有修改过的文件?*
(*通过使用自动去除文件某些部分的工具,可以实现修改但空的差异)
答案 0 :(得分:2)
考虑使用git add -u
。你的另一个主要选择是编写你自己的程序,但实际上并不重要。
Obsidian's answer略显错误,但却不是那么重要,但原始问题中缺少一条(至少在这一点上 - 问题可能会被编辑以解决此问题)可能误导:
(*修改但空的差异可以通过使用剥离文件的某些部分的工具发生)
......之前...什么? : - )
我想我知道你在这里要说的是:你可以有一个清理过滤器来编辑文件,而Git正在复制这些文件&#39;从工作树到索引/登台区域的内容。
请记住,在Git中,当你工作时,文件中有三个活动副本(或者如果你正处于冲突合并的中间,那么它会更多,尽管它依赖于如何计算)。对于每个文件:
有HEAD
版本,它是只读的。您可以git show HEAD:path
查看它。它实际上是以一种特殊的,仅限Git的压缩格式存储的; git show
必须将其展开。
有索引/暂存区版本。这最初只是文件的HEAD
版本的副本。与HEAD
版本一样,它是一种特殊的,仅限Git的压缩格式;但与HEAD
版本不同,您可以覆盖此文件。
最后,有一个Git本身并不关心的版本,但您可能会这样做:那是您工作树中的版本。这是您的计算机可以处理的普通格式,因此它可以读/写,您可以执行任何您想要的操作。 Git不在乎; Git主要关注索引版本。
由于索引和工作树版本都是可写的,因此您可以更改其中一个或两个版本。通常,您更改工作树版本,然后告诉Git将工作树版本复制回索引。 git add
的作用是:从工作树复制到索引中。如果您定义了清理过滤器,和/或设置了行结束更改,git add
会在应用过滤器时将文件复制到索引中。
将文件从索引复制到工作树的命令(复数)可以应用涂抹过滤器和/或执行行结束更改。我们每天使用的通常是git checkout
,它从索引复制到工作树,或者从提交复制到两者索引和工作树,取决于您调用git checkout
的方式。
由于存在涂抹和清理过滤器,因此在将文件的索引版本与同一文件的工作树版本进行比较时,git diff
必须做一些特殊的魔术。 Git的选择是在工作树副本上运行clean过滤器。有关详细信息,请参阅my answer to a related question。这里也发生了一些优化:Git尝试知道清理的工作树文件是否与索引版本匹配,而不必在文件上运行清理过滤器。如果您更改过滤器 - 这包括更改行尾设置 - Git可能会对每个文件的清洁度感到困惑。解决此问题的最简单方法是使用以下两个步骤:
.git/index
:这将删除所有暂存的文件。git reset
(没有其他选项):这会从HEAD
提交中重新创建索引。当然,这也会消除你所拥有的任何精心上传的文件。另一种方法是更新工作树中每个文件的修改时间戳(例如find . -name .git -prune -o -print0 | xargs -0 touch
,但也有恼人的副作用.Git需要一个命令(或git reset
的标志)来使其无效并重新计算所有缓存数据,而不删除暂存的文件。它没有,所以我们都被卡住了。
这让我们回到最初的问题:
是否有一个git命令来添加
git diff <file>
的输出不为空的所有修改过的文件?
是的,它是git add
,特别是git add -u
,is documented this way:
如果没有&lt; pathspec&gt;在使用-u
选项时,给出所有跟踪的文件
在整个工作树中更新(Git的旧版本用于
将更新限制为当前目录及其子目录)。
我说&#34;有点&#34;因为这也删除工作树中缺少但存在于索引中的文件。它至少可以说 re -adds文件不显示索引副本和工作树副本之间的任何差异。
当git add
完成添加已清理文件后,Git会在索引中更新其缓存信息,以便它现在知道该文件是干净的。如果这为索引添加了一个与索引中已有的副本匹配的文件副本,那么,是什么?索引中的文件保持不变,但现在索引中的缓存时间戳信息是正确的。你花了一些计算时间来做这件事,但这可能比花个人时间更好。
答案 1 :(得分:1)
(*修改但空的差异可以通过使用剥离文件的某些部分的工具发生)
不,它不能。如果删除跟踪文件的某些部分,则会显示为带有以“ - ”符号开头的行的更改块。此外,git与快照一起使用并始终存储完整的文件内容,并使用SHA1总和来命名和验证它。所以,如果你得到一个空的差异,那么文件将被强制改变,除非我出错了。
关于你们其他人的问题,你仍然可以使用
git add -u
...自动添加已经跟踪的更新文件。
编辑:将git diff <filename>
与单个文件名一起使用时,会将您的文件与索引进行比较。换句话说,一旦你添加了修改后的文件,它就会远离常规差异,并在git status
结果列表中从红色切换为绿色。
查看仍然的添加与否是很方便的。您可以使用
查看已添加的内容git diff --cached
(或--staged,这是一个同义词)。 如果您想“取消添加”文件,请使用
git reset <filename>
...将索引恢复到HEAD指向的提交状态而不更改工作树(也就是说,不在这里使用--hard
)。