Git:列出所有分支中一个目录下的所有文件?

6

我有一些文件需要查找,但是不确定它们被放在哪个分支中。我想列出给定目录下所有分支的所有文件。

我的问题是,在git中,是否有一种方法可以列出跨所有分支的目录中的所有文件?


你知道文件名吗? - hjpotter92
git-ls-files文档来看,我们仍然需要从所有分支中检出文件夹的内容。因此,直接的方法是:1)获取分支列表;2)对于每个分支,检出文件夹并在其上执行git-ls-files。 - raina77ow
我们知道文件的模式,但不知道确切的文件名。 - hawkeye
你尝试过 git log --pretty=format: --name-only --diff-filter=A | sort -u 吗?这些可能会对你有所帮助:https://dev59.com/x3RB5IYBdhLWcg3wtZIV#543426 和 http://superuser.com/a/429694 - Bharadwaj Srigiriraju
3个回答

4
您可以使用 git ls-tree 命令获取目录中的文件。
这里我将 git ls-tree 的输出写入到一个文件中。
$ for branch in $(git for-each-ref --format='%(refname)' refs/heads/); do 
     git ls-tree -r --name-only $branch <directory> >> file-list ; 
  done

您可以通过以下方式获取唯一的文件:

sort -u file-list

1
使用 git ls-tree -r 命令递归列出特定 treeish 的所有文件。结合 git for-each-ref 枚举分支和一些 shell 过滤器。
for i in $(git for-each-ref '--format=%(refname)' 'refs/heads/*') ; do
  echo $i
  git ls-tree -r $i | awk '$4 ~ /filename-pattern/ {print $4}'
  echo
done

filename-pattern替换为能够匹配您所需文件的正则表达式。记得转义路径中的斜杠。


1
要专注于特定目录,请使用$i:path/to/it,我不确定,但我认为 OP 只想要一个目录,即不使用-r - jthill
谢谢@jthill。我该怎么做?(只有一个目录) - hawkeye
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - jthill

0

感谢https://stackoverflow.com/users/1587370/pratz的帮助。

有时候在报告中也包含分支名称会很有用。

for branch in $(git for-each-ref --format='%(refname)' refs/heads/); do 
     git ls-tree -r --name-only $branch . |xargs -L 1 echo \#$branch: 
done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接