如何让git递归地列出所有未跟踪的文件?

11

我想要编写程序获取未被跟踪的文件列表。然而,我似乎无法让git报告未被跟踪目录中的未被跟踪文件,它总是只列出包含文件的最低级别目录。

我尝试了以下方法:

git status --untracked-files=all

并且

git ls-files --others --exclude-standard

在目录中暂存任何文件都会使git报告该目录中的所有其他文件,但我并不想这样做。
另外,我可以使用bash列出所有文件,但是然后我需要让git告诉我哪些文件被忽略了。
有没有纯粹使用git的方法来解决这个问题?或者使用其他工具进行高效处理的方法?

3
git status --untracked-files=all 应该等同于 git status -u,并且应该显示未跟踪的文件在没有其他文件被跟踪的目录中。这对你仍然不起作用吗? - Chris
2
你使用的Git版本是什么?在2.16.4中,git status --untracked-files=allgit ls-files --others --exclude-standard似乎都可以得到你想要的结果,即列出所有未跟踪但未被忽略的文件。 - das-g
我使用的是2.15.2版本,所以看起来这就是答案!您想要添加它吗? - peterjwest
1
请注意,只要支持 git status -uallgit ls-files --others --exclude-standard(这两个命令已经存在很长时间)的所有 Git 版本都应该按照这种方式工作... - torek
我已经升级到2.18.0版本,但行为仍然相同 :( - peterjwest
好的,事实证明这只会发生在特定文件夹中,但是权限/组/所有者与另一个没有此问题的文件夹完全相同。我想知道是否存在某些OSX特定设置? - peterjwest
2个回答

4
Git不会展开未跟踪的文件夹,这些文件夹也是Git仓库。
这些被称为“嵌套的Git仓库”,并在Git仓库中记录为git链接(gitlinks),它们是父仓库索引中的特殊条目。
由于它们是一个条目(一种特殊的“文件”),因此它们不会受到“-untracked-files=all”的影响。
请注意,如果您使用了-untracked-files=all,请在Git 2.38(2022年第三季度Q3)及以上版本中使用,该版本修复了一个错误,使得write-tree无法将不存在的索引写出为树形结构,该错误是在2.37中引入的。
请参见提交4447d41(2022年7月22日),作者为Martin Ågren(none
(由Junio C Hamano -- gitster --提交f1a0db2中合并,2022年8月3日)read-cache: 使do_read_index()始终设置istate->repo。 报告人:Joey Hess,签名者:Martin Ågren。”
(注:该段文本可能与特定领域或行业相关,翻译仅供参考。)
如果没有索引文件,例如因为刚创建了存储库,我们会尽早返回零(除非must_exist让我们立即退出)。这个早期返回意味着我们不会设置istate->repo。使用core.untrackedCache=true,最近的e6a6535("untracked-cache: support '--untracked-files=all' if configured",2022-03-31,Git v2.37 -- merge)将最终将istate->repo作为空指针传递给repo_config_get_string(),导致分段错误。如果我们确实遇到了这个早期返回,就像我们实际读取索引时一样设置istate->repo

3
最终得到的答案是:Git不会扩展未跟踪的文件夹,这些文件夹也是Git仓库。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接