git ls-tree输出工作目录?

时间:2012-04-10 02:47:12

标签: git

我正在寻找一种方法,以与ls-tree相同的方式输出,但是我的工作目录。每当我运行git ls-tree .时,它会显示fatal: Not a valid object name .

2 个答案:

答案 0 :(得分:17)

git ls-tree仅适用于git refs,例如ls-tree HEAD

试试git ls-files。您可能需要-s和/或-m标记。


正如您所指出的,git ls-files -s将列出索引中的文件(即已暂存的文件)。

理论上,你可以搞乱索引,运行git ls-files -s,然后尝试恢复它,例如

git commit
git add .
git ls-files -s
git reset .
git reset --soft HEAD^

看似正确,并且在一个简单的测试中工作,但可以吃掉所有文件。

答案 1 :(得分:1)

这类似于@mikel 的回答,但按照 OP 的要求使用了 git stash createls-tree。 还要避免使用 git reset,这对于没有经验的用户来说更有可能破坏事情。

但这仅适用于跟踪文件。

git ls-tree `git diff --quiet && echo HEAD || git stash create ls-tree` 

这会留下一个 dangling commit,它最终应该被 git gc 删除。 (实际上是 two dangling commits。) 当然,您可以搜索包含 ls-tree 的悬空提交,但我还没有找到一种简单的方法(至少不是没有相当多的 sedgrep 魔法 - 建议欢迎)。

说明

git ls-tree 需要一个哈希值。如果树是干净的(git diff --quiet 返回 0),则可以使用 HEAD。如果不是,git stash create 将创建一个提交并返回它的哈希值。

未跟踪

遗憾的是 git stash create 不支持 -a/-u 或其他标志。因此无法显示未跟踪文件的哈希值。获取他们的信息有点复杂:

git stash -a
git ls-tree stash
git ls-tree stash^3
git stash pop

这将首先显示已跟踪的文件 (git ls-tree stash),然后是未跟踪的文件 (git ls-tree stash^3)。 torek provides a good explanation 为什么需要 stash^3