在Git中,如何从一个修订版到另一个修订版获得文件更改的详细列表?

Jea*_*let 23 git rename file-listing

我在服务器上使用Git存储库来版本化发送到服务器的用户数据文件.我有兴趣在任何两个版本之间获取已更改文件的列表.

我知道git diff --name-only <rev1> <rev2>,但这只给了我一个文件名列表.我也对重命名和复制特别感兴趣.理想情况下,输出将是这样的:

updated:  userData.txt
renamed:  picture.jpg -> background.jpg
copied:   song.mp3 -> song.mp3.bkp
Run Code Online (Sandbox Code Playgroud)

可能吗?--name-status似乎也没有表示重命名和副本.

Von*_*onC 28

git diff --name-status -C <rev1> <rev2>
Run Code Online (Sandbox Code Playgroud)

应该更接近你想要的.

--name-status 将显示文件名及其各自的状态:

(A|C|D|M|R|T|U|X|B)
Run Code Online (Sandbox Code Playgroud)

添加(A),复制(C),删除(D),修改(M),重命名(R),
类型(即常规文件,符号链接,子模块,...)更改(T),未
合并(U),未知(X) ),或配对破碎(B)

(OP Jean Philippe Pellet补充说:

状态的字母RC"总是后跟一个分数,表示移动或复制的源和目标之间的相似率,并且是唯一如此".)

关于复制或移动的文件:

-C[<n>]
--find-copies[=<n>]
Run Code Online (Sandbox Code Playgroud)

检测副本以及重命名.如果n指定,则其含义与-M<n>.

--find-copies-harder
Run Code Online (Sandbox Code Playgroud)

出于性能原因,默认情况下,-C仅当在同一变更集中修改了副本的原始文件时,选项才会查找副本.
此标志使命令检查未修改的文件作为副本源的候选者.
对于大型项目来说,这是一项非常昂贵的操作,因此请谨慎使用.提供多个-C选项具有相同的效果.


brauliobo 在评论中建议:

git diff --stat -C
git show --stat -C
git log --stat -C
Run Code Online (Sandbox Code Playgroud)

  • 太好了,这正是我需要的。为完整起见,我将添加状态字母“R”和“C”“总是后跟一个分数,表示移动或复制的源和目标之间的相似性百分比,并且是唯一如此的分数”([来源](http://www.kernel.org/pub/software/scm/git/docs/git-diff.html))。 (2认同)