【问题标题】:git: list all file names and the hashes of their latest commitgit:列出所有文件名及其最新提交的哈希值
【发布时间】:2016-12-11 19:56:31
【问题描述】:

我想获取我的分支中所有文件的列表,最好是在树视图中,以及它们上次修改的提交的哈希(即不是文件本身的哈希,而是提交的哈希) .是否有一个简洁的 git 命令来执行此操作,还是我真的必须爬过日志?

这个问题与How do I find the most recent git commit that modified a file?有关,但我想获取所有文件的列表,例如:

6f88a51 abc.h
3f5d6fb abc.cpp
3f5d6fb bcd.h
1964be2 bcd.cpp
...

【问题讨论】:

  • git log <branch> -- 怎么样?

标签: git


【解决方案1】:

命令:

$ git ls-files -z \ | GIT_PAGER= xargs -0 -L1 -I'{}' git log -n 1 --format="%h {}" -- '{}' f5fe765 LICENSE 0bb88a1 README.md 1db10f7 example/echo.go e4e5af6 example/echo_test.go ...

注意事项:

  • git ls-files 以递归方式列出所有添加到 git 的文件(与 find 不同,它不包括未跟踪的文件和 .git
  • xargs -L1 为每个输入参数(文件名)执行给定的命令
  • xargs -I{} 允许用输入参数(文件名)替换 {} 符号
  • 使用git ls-files -zxargs -0 将分隔符从\n 更改为\0,以避免文件名中出现空格的潜在问题
  • 清除GIT_PAGER 可防止git log 将其输出通过管道传输到less

【讨论】:

  • arigato,非常好! blue112 解决方案也可以正常工作,但我发现你的更好
【解决方案2】:

你可以简单地使用 ls-tree 命令

git ls-tree HEAD

这将向您显示最新的文件及其哈希值。

【讨论】:

  • 这是不正确的。它显示了 blob 和树的 SHA-1(OP 明确表示他不想要),而不是触及文件的最新提交的 SHA-1。
  • @Alderath 是对的,它显示文件哈希,而不是提交哈希。此外,它不会递归地打印目录。
  • 虽然这不是预期的,但 git ls-tree -r HEAD 可以显示 HEAD 树中的所有 blob。
  • 这正是我不想要的,但感谢您的思考;)
  • 帮助操作与否,这篇文章对我的用例很有用,所以谢谢!
【解决方案3】:
for i in $(find -type f | grep -v '.git'); 
    do echo -n "$i - "; 
    git log --pretty="format:%h" -1 $i | cat; 
    echo; 
done

这应该可以解决问题,在 bash 上

【讨论】:

  • 谢谢,也给了我想要的东西,但我更喜欢 gavvs 解决方案,因为它更优雅
猜你喜欢
  • 2022-06-29
  • 2013-04-28
  • 1970-01-01
  • 2013-09-11
  • 2018-06-19
  • 1970-01-01
  • 2020-10-11
  • 2013-03-18
  • 2016-04-03
相关资源
最近更新 更多