如何列出Git中每个修订的每个文件(例如Mercurial的hg清单--all)?


10

Mercurial有一个命令可以列出存储库中每个版本的每个文件:

hg manifest --all

Git中有等效的命令吗?


像git log --stat之类的东西吗?
jmreicha 2011年

4
git ls-files
NN

只是好奇,您出于什么原因需要它?
斯蒂芬·詹宁斯

@StephenJennings:这是一种更好的方法来知道一个文件受版本控制,而不是费心地执行“ ls -R减号.gitignore”。总的来说,它的有用性:人们可能或多或少知道发生了什么,但是对存储库的内省给了我们一个知道的信心。特别是对于初学者,这种信心在程序使用的愉快程度方面有很大的不同。Git并没有让用户放心,这就是为什么如此多的人讨厌它直到学到它才可以理解。
Esteis 2012年

Answers:


3

我在shell脚本方面绝对很糟糕,所以这肯定不是最理想的,但是如果您使用的是bash,这种事情可能会对您有所帮助。希望有人可以过来清理它,或用更好的东西代替它。我只在Mac上进行过测试,因此请注意。

它应该在提交中打印所有文件,这些提交是当前HEAD的祖先。将其保存在manifest.sh路径中某个位置的文件中:

#!/bin/bash

TFILE=$(mktemp -t git-manifest)

for sha in $(git log --pretty=format:%H)
do
    git ls-tree --name-only --full-tree -r $sha >> $TFILE
done

sort -u $TFILE
rm $TFILE

1
不需要,export因为它不需要在子进程中可用。如果循环是通过SHA散列进行的,则该循环可以正常工作,否则使用read和引用变量的方法会更好。sort具有执行功能的-u选项uniqrm当您中途取消时,文件将不会得到d,trap为此您需要一个d ,但是对于该脚本而言这可能过多。
丹尼尔·贝克

@DanielBeck:谢谢,我稍作更新。mktemp在Git Bash中不存在,我应该想办法解决该问题,以便Windows也可以玩。
史蒂芬·詹宁斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.