需要获取两次Git提交之间的所有文件差异(添加,修改,重命名)

布雷特

我正在尝试导出两个提交之间存在差异的所有文件,这些差异是:

  • 新文件(已添加)
  • 修改后的文件
  • 重命名文件
  • 如果可能,有关任何已删除文件的信息

检测重命名可能很困难,因为我将在Windows 7环境中进行导出,因此somefile.phpSomeFile.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.renamesdiff.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-treediff-filter包括AM和不包括D足够了。不太清楚如何处理T,这是用于类型更改:例如,从普通文件到符号链接,或从文件到子存储库提交哈希(Git 将其称为 gitlink条目,用于子模块)。

同样的,你希望启用复制检测:一个C状态,比如R,呈现出相似性指数和路径名。如果禁用它,您只需将新路径名作为Added 文件获取。

即使你做了这一切,你仍然会陷入陷阱。假设提交散列C1有一个名为 的文件problem,而(大概是稍后)提交散列C2有两个名为problem/A和 的文件problem/B这意味着原始文件在这两点之间problem删除了,因为大多数系统(包括 Git 本身)都禁止同时使用命名文件problem命名目录来problem保存各种文件。鉴于每个 tar-archive 本身都不是一个完整的快照——你省略了C1C2之间未修改的文件——你提取过程这些快照必须是附加的:提取较早的快照,然后在较早的快照之上提取较晚的快照。当 file妨碍创建目录时,此过程将失败显然,您可以检查此类问题并删除有问题的文件(您现在可以看到我为什么命名该文件:-) ),但更普遍的是,由于您首先没有存储“删除”指令,因此您不会要知道,在将来使用这些档案重建快照的情况下,某些文件根本不属于该快照。problemproblemproblem

问题的经典解决方案是在 update-archives 前面加上某种清单或指令。如果您决定使用这样的解决方案,那么,根据清单或指令中所需的详细信息类型,您可能会想要进行第一遍以检测确切的重命名和/或准确的副本。)


1显然,新添加的功能可能会给每个人带来问题,不仅仅是脚本,不仅仅是人类,但 Git 人员确实努力工作,不会为依赖管道命令的脚本造成不必要的问题。例如,考虑一下推动 Git 使用某种风格的 SHA-256 代替或补充 SHA-1新动力由于 SHA-1 产生 160 位哈希值,而 SHA-256 产生 256 位哈希值,因此它们必须分别表示为 40 位和 64 位十六进制数字。Linus 建议默认情况下将 256 位哈希缩写为 40 个字符,以帮助现有的假设为40 个字符的脚本,但我预见到一些问题...... :-)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

获取两次提交之间的所有标签的列表

来自分类Dev

git-如何在两次提交之间签出所有更改的文件

来自分类Dev

两次提交之间的Git差异在中间没有一些提交

来自分类Dev

Svnkit:远程获取两次提交修订之间的差异

来自分类Dev

Git:在特定分支的两次提交之间获取提交

来自分类Dev

查看git两次提交之间的所有提交列表(跨分支)

来自分类Dev

获取两次提交或分支之间已更改文件的列表

来自分类Dev

我可以通过GH API获得两次提交之间的一个文件的差异数据吗?

来自分类Dev

使用JGit在两次提交之间更改的文件列表

来自分类Dev

Git diff没有显示不同分支上文件之间的绝对差异(所有提交之间的原始差异)

来自分类Dev

我的 javascript 文件中的所有内容都需要单击两次才能触发

来自分类Dev

两次扩展之间的差异

来自分类Dev

重命名文件后,在分支之间获取有用的git diff输出

来自分类Dev

如何重命名文件夹下的所有文件名以在Windows中添加修改日期作为前缀

来自分类Dev

更改列出所有添加的文件,而不是仅最后一次提交修改

来自分类Dev

Git:仅提交指定的文件(重命名,删除,修改,新文件等)

来自分类Dev

Git:两次初始提交

来自分类Dev

如何在git上的所有提交中找到所有重命名?

来自分类Dev

当我运行Windows bat通过添加长度超过2个字符的前缀来重命名一组文件时,为什么第一个文件将被重命名两次?

来自分类Dev

如果上传两次,重命名图像名称?

来自分类Dev

带有 PHP ZipArchive 的 Laravel - 添加文件两次

来自分类Dev

如何在不进行交互式变基的情况下删除两次提交之间的所有提交

来自分类Dev

如何在不进行交互式变基的情况下删除两次提交之间的所有提交

来自分类Dev

jQuery验证需要单击两次提交提交表单

来自分类Dev

Git:修改先前的提交以更改被误解的重命名

来自分类Dev

git status显示由于大小写而被重命名后修改的两个文件

来自分类Dev

更新mongoDB文件需要两次

来自分类Dev

如何仅列出在两次提交之间更改的文件的名称?

来自分类Dev

带有Ajax表单提交的AngularJS需要单击两次

Related 相关文章

  1. 1

    获取两次提交之间的所有标签的列表

  2. 2

    git-如何在两次提交之间签出所有更改的文件

  3. 3

    两次提交之间的Git差异在中间没有一些提交

  4. 4

    Svnkit:远程获取两次提交修订之间的差异

  5. 5

    Git:在特定分支的两次提交之间获取提交

  6. 6

    查看git两次提交之间的所有提交列表(跨分支)

  7. 7

    获取两次提交或分支之间已更改文件的列表

  8. 8

    我可以通过GH API获得两次提交之间的一个文件的差异数据吗?

  9. 9

    使用JGit在两次提交之间更改的文件列表

  10. 10

    Git diff没有显示不同分支上文件之间的绝对差异(所有提交之间的原始差异)

  11. 11

    我的 javascript 文件中的所有内容都需要单击两次才能触发

  12. 12

    两次扩展之间的差异

  13. 13

    重命名文件后,在分支之间获取有用的git diff输出

  14. 14

    如何重命名文件夹下的所有文件名以在Windows中添加修改日期作为前缀

  15. 15

    更改列出所有添加的文件,而不是仅最后一次提交修改

  16. 16

    Git:仅提交指定的文件(重命名,删除,修改,新文件等)

  17. 17

    Git:两次初始提交

  18. 18

    如何在git上的所有提交中找到所有重命名?

  19. 19

    当我运行Windows bat通过添加长度超过2个字符的前缀来重命名一组文件时,为什么第一个文件将被重命名两次?

  20. 20

    如果上传两次,重命名图像名称?

  21. 21

    带有 PHP ZipArchive 的 Laravel - 添加文件两次

  22. 22

    如何在不进行交互式变基的情况下删除两次提交之间的所有提交

  23. 23

    如何在不进行交互式变基的情况下删除两次提交之间的所有提交

  24. 24

    jQuery验证需要单击两次提交提交表单

  25. 25

    Git:修改先前的提交以更改被误解的重命名

  26. 26

    git status显示由于大小写而被重命名后修改的两个文件

  27. 27

    更新mongoDB文件需要两次

  28. 28

    如何仅列出在两次提交之间更改的文件的名称?

  29. 29

    带有Ajax表单提交的AngularJS需要单击两次

热门标签

归档