我正在尝试导出两个提交之间存在差异的所有文件,这些差异是:
检测重命名可能很困难,因为我将在Windows 7环境中进行导出,因此somefile.php
与SomeFile.php
; 但我会将它们上传到*nix环境,该环境确实将这些文件视为不同的,因此如果可能,需要识别和导出它们。
我正在使用以下命令:
git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT $head_commit_id $older_commit_id | xargs tar -cf project.tar -T -
但是我注意到它没有导出新的/添加的文件,也没有导出重命名的文件;然后我发现git diff-tree
默认情况下不进行重命名检测,所以从我所看到的我需要添加--find-renames
到命令中?
正如在CodeWizard 的回答中一样,您可以使用“用户友好”(或瓷器)命令git diff
而不是git diff-tree
,Git 称之为管道命令,用于脚本。但是,您应该了解这意味着什么。
由于瓷器命令是为人类设计的,它们试图以人类可读的方式呈现事物。这意味着他们遵守某个人在各种配置文件中为他/她自己设置的任何设置。这包括diff.renames
和diff.renameLimit
配置。他们还可能修改他们的输出,使眼球更容易处理,但计算机程序更难处理。最糟糕的是,如果人们似乎更喜欢某些默认版本,他们可能会将其输出从一个 Git 版本更改为另一个版本。
由于脚本不适用于上述情况,因此它们以可预测的方式运行,输出不会改变,也不依赖于配置项。这样,无论您要求什么,您都会得到:您将以可靠的形式获得可靠的输出,因此,如果您编写自己的可靠代码,它不会只在今天起作用,就一种情况而言;它将在未来继续工作,适用于所有可能的情况。1个
最后,这意味着如果您使用git diff-tree
并设置正确的标志,您将获得更可靠的输出。如果您使用git diff
,您的重命名检测取决于:
正如您所发现的,重命名检测的输出是两个路径名,这不是您可以通过管道传输到存档器的东西。存档者通常在文件删除方面存在问题(这也许是存档与备份/快照之间的经典区别;请注意,这两者都与版本控制有关)。
如果你的目标是所有文件的一种联合——即,如果差异表明A
添加了一个名为的文件,一个名为的D
文件R
被删除,并且文件是通过重命名旧名称创建的O
(也许还修改它:注意 Git 的相似性索引字母之后的数字R
),那么您希望收集文件A
,忽略文件D
,并收集文件R
而忽略文件O
- 那么,您首先想要的是不检测重命名!如果您不检测重命名git diff-tree
(默认情况下不会检测),则相同的差异将显示为:添加文件A
、删除文件D
、删除文件O
和添加文件R
. 因此,一个git diff-tree
有diff-filter
包括AM
和不包括D
足够了。不太清楚如何处理T
,这是用于类型更改:例如,从普通文件到符号链接,或从文件到子存储库提交哈希(Git 将其称为 gitlink条目,用于子模块)。
同样的,你不希望启用复制检测:一个C
状态,比如R
,呈现出相似性指数和对路径名。如果禁用它,您只需将新路径名作为A
dded 文件获取。
即使你做了这一切,你仍然会陷入陷阱。假设提交散列C1有一个名为 的文件problem
,而(大概是稍后)提交散列C2有两个名为problem/A
和 的文件problem/B
。这意味着原始文件在这两点之间problem
被删除了,因为大多数系统(包括 Git 本身)都禁止同时使用命名文件problem
和命名目录来problem
保存各种文件。鉴于每个 tar-archive 本身都不是一个完整的快照——你省略了C1和C2之间未修改的文件——你的提取过程这些快照必须是附加的:提取较早的快照,然后在较早的快照之上提取较晚的快照。当 file妨碍创建目录时,此过程将失败。显然,您可以检查此类问题并删除有问题的文件(您现在可以看到我为什么命名该文件:-) ),但更普遍的是,由于您首先没有存储“删除”指令,因此您不会要知道,在将来使用这些档案重建快照的情况下,某些文件根本不属于该快照。problem
problem
problem
(此问题的经典解决方案是在 update-archives 前面加上某种清单或指令。如果您决定使用这样的解决方案,那么,根据清单或指令中所需的详细信息类型,您可能会想要进行第一遍以检测确切的重命名和/或准确的副本。)
1显然,新添加的功能可能会给每个人带来问题,不仅仅是脚本,不仅仅是人类,但 Git 人员确实努力工作,不会为依赖管道命令的脚本造成不必要的问题。例如,考虑一下推动 Git 使用某种风格的 SHA-256 代替或补充 SHA-1的新动力。由于 SHA-1 产生 160 位哈希值,而 SHA-256 产生 256 位哈希值,因此它们必须分别表示为 40 位和 64 位十六进制数字。Linus 建议默认情况下将 256 位哈希缩写为 40 个字符,以帮助现有的假设为40 个字符的脚本,但我预见到一些问题...... :-)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句