17

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

4

3 回答 3

25

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

试试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^

似乎是对的,并且在一个简单的测试中工作,但可以吃掉你所有的文件。

于 2012-04-10T04:39:47.737 回答
3

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

但是,这仅适用于跟踪的文件。

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

这将留下一个悬空提交,最终应由git gc. (实际上是两个悬空提交。)当然,您可以搜索包含 的悬空提交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 很好地解释了为什么stash^3需要。

于 2021-01-21T13:14:02.903 回答
1

试图找到一些不涉及 git repo 的东西。

这不仅仅是 git,它依赖于像 'grep' 这样的 linux

#from root of repo dir
git ls-tree -r HEAD 
#other dirs
git ls-tree -r HEAD | grep <relative_path_to_repo_root>/
# eg
git ls-tree -r HEAD | grep src/

还发现以下(仅限 git)在 repo root 的子目录中工作

git ls-tree -r --full-name HEAD

然而手册页(man git-ls-tree)是刺激 git 逻辑

   --full-name
       Instead of showing the path names relative to the current working directory, show the full path names.

   --full-tree
       Do not limit the listing to the current working directory. Implies --full-name.
于 2021-12-13T13:48:03.410 回答