如何使`git ls-files`在子目录中生效?

4
我希望运行git ls-file --modified命令来获取具有未暂存更改的文件列表。我惊讶地发现它在根目录中有效,但在任何子目录中都无效,只打印子目录中的文件(与git status相反)。
重现步骤:
mkdir repo
cd repo
git init
touch file.txt
git add file.txt 
mkdir subdirectory
echo "foo" >> file.txt    # file now has unstaged changes
git ls-files --modified   # This prints 'file.txt'
cd subdirectory/
git ls-files --modified   # This prints nothing

我该如何改变git的行为?


ls-files 对于父目录无效,但对于子目录有效。 - vinodsaluja
1个回答

6

默认情况下,许多git命令都会以当前工作目录为基准运行(例如git status、ls-files等)。

您可以使用-C选项:

git -C ../ ls-files --modified

如果您想让命令相对于git的“toplevel”运行,可以运行:

git -C $(git rev-parse --show-toplevel) ls-files --modified

来自 Git 的 man 手册:

   -C <path>
       Run as if git was started in <path> instead of the current working directory. When multiple -C options are given, each subsequent

编辑 这还取决于您需要什么类型的输出,就像@phd not所说的那样。请参阅下面的命令和输出以了解不同选项及其输出:

> git -C ../ ls-files --modified
file.txt
> git -C $(git rev-parse --show-toplevel) ls-files --modified # wrt git toplevel no matter how deep you are in the tree
file.txt
> git ls-files --modified ../
../file.txt
> git ls-files --modified $(git rev-parse --show-cdup) # wrt git toplevel no matter how deep you are in the tree
../file.txt

1
git -C 的缺点在于 git ls-files 显示的是与根目录相关的修改文件,而不是当前目录。在我看来,更好的方法是 git ls-files --modified $(git rev-parse --show-cdup) - phd
@phd:感谢您的提示,我已将其添加到我的答案中。 - Chris Maes

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