2013-12-09 49 views
1

我需要一种方法来列出在我的资源库根目录中存在的所有目录。我需要他们从每个分支和标签。Git:列出回购根目录下的所有目录

例如:
我目前的回购在主分支的根目录有20个目录。在我们的开发分支上,曾经有一个名为“lib”的目录。此目录已被删除。我需要一个列出这个“lib”文件夹的命令,以及在其分支的当前提交中可能存在或可能不存在的所有其他目录。我需要他们。

我试过“rev-list”,但它似乎只给出当前分支的结果。

+0

你试过用'git whatchanged --pretty = oneline --remote'吗? – onionpsy

+0

不知道我明白。什么是“whatchanged”应该是什么? – epb

+0

他字面意思是'git whatchanged'。这实际上是一个比我的建议快得多的执行的好建议,但它确实依赖porcelain命令,并且需要稍微更复杂的输出分析。 –

回答

2

您可以使用git cat-file -p打印树对象的内容,并且commit^{tree}表示法提取提交的树对象,即可以说git cat-file -p HEAD^{tree}列出当前提交的根目录内容。使用git rev-list --all获取所有提交的SHA-1,并过滤除树对象之外的任何内容。

while read commit ; do 
    git cat-file -p $commit^{tree} 
done < <(git rev-list --all) | awk '$2 == "tree" { print $4 }' | sort -u 

如果您的存储库很大,您可以期待这需要一些时间。我用git.git(37k提交)尝试了它,并且用了大约四分钟的时间才得到一个热缓存。如果您的目录名称中有空格,则必须调整过滤器。

+0

似乎是“完成”之后第3行的语法错误。 (我使用cygwin,如果这很重要。) – epb

+1

你使用的是什么shell?你的shell可能不喜欢路径替换('<(git ...)')。该命令在bash和zsh(在Linux上)都正常工作。你可以试试这个:'git rev-list --all |而读取提交;做git cat-file -p $ commit^{tree};完成| awk'$ 2 ==“tree”{print $ 4}'|排序-u'。 –

+0

我正在使用cygwin(实际上是git bash)。第二个命令很好,除了我得到一个异常:STATUS_ACCESS_VIOLATION。不过,它看起来仍然有相当完整的产出。 – epb

相关问题