我正在寻找一种方法,以与ls-tree
相同的方式输出,但是我的工作目录。每当我运行git ls-tree .
时,它会显示fatal: Not a valid object name .
答案 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 create
和 ls-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
的悬空提交,但我还没有找到一种简单的方法(至少不是没有相当多的 sed
和 grep
魔法 - 建议欢迎)。
说明
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
。