我如何使 `git ls-files` 在子目录中工作?

How an I make `git ls-files` work in subdirectories?

我想运行 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 的行为?

默认情况下,许多 git 命令 运行 关于您当前的工作目录(git 状态,ls-files,...)。

您可以使用 -C:

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

如果你想要 运行 相对于 git 'toplevel' 的命令,你可以 运行:

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

来自 git 的手册页:

   -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 不是。请参阅以下命令和输出以了解不同的选项及其输出:

> 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