我正在寻找一种以与ls-tree
我的工作目录相同的方式输出的方法。每当我运行git ls-tree .
它说fatal: Not a valid object name .
3 回答
git ls-tree
仅适用于 git refs,例如ls-tree HEAD
或ls-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^
似乎是对的,并且在一个简单的测试中工作,但可以吃掉你所有的文件。
这类似于@mikel 的答案,但按照 OP 的要求使用git stash create
and 。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
需要。
试图找到一些不涉及 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.