Git状态 - 有没有一种方法只显示特定目录中的更改?

173

我想查看自上次提交以来修改过的文件列表,就像 git status 显示的那样,但我只关心位于单个目录中的文件。有办法做到这一点吗?我尝试了 git status <directory>,但似乎这完全是不同的事情(列出所有更改的文件,就好像我先写了 git add <directory>)。

git-status 的文档并没有提供太多信息,除了它接受与 git-commit 相同的选项(但 git-commit 的目的不是显示更改文件的列表)。

4个回答

250

在目录内部:

git status .

您可以使用任何路径,只需使用以下语法:

git status <directoryPath>

例如对于路径为"my/cool/path/here"的目录

git status my/cool/path/here

4
谢谢!'git status <directory>' 看起来做了我预期的事情 - 老实说,我不记得以前遇到什么问题了...也许是因为使用了不同的 git 版本,我不确定。 - Kuba Suder
没问题,并且可能 - Git 的新版本似乎让事情更容易了。 - Sam Doidge
4
没错,行为在1.6和1.7之间肯定发生了变化。它在1.7中符合OP的要求,但1.6则适用于整个存储库。 - colgur
1
尽管我已经熟悉了像stash和rebase这样的最复杂的命令,但我仍在寻找这个命令,因为我不想看到被跟踪的文件处于红色状态。git rm也没有用,因为它会在提交时从索引中删除,但是当只需要处理少量文件时,实际上需要这个命令。简单的解决方案总是那些看不见的。 - Shashank Bhatt
7
我必须使用 git -C <directory> status - Jake Ireland
git diff --stat - Gjaa

35
git statusgit commit 接受相同的选项是因为 git status 的目的是展示如果你使用与传递给 git status 相同的选项提交时会发生什么。从这个角度来看,git status 实际上就是 git commit --preview
为了得到您想要的结果,您可以执行以下操作以显示暂存的更改:
git diff --stat --cached -- <directory_of_interest>

还有这个,显示未暂存的更改:

git diff --stat -- <directory_of_interest>

或者这个,它展示了两者:

git diff --stat HEAD -- <directory_of_interest>

3
这部分功能可以正常工作,但它无法显示新创建的(未跟踪的)文件,就像git-status那样... - Kuba Suder
好的,我不确定你需要哪些报告。如果你需要检查未提交的文件,请尝试使用 git ls-files --others <directory_in_question> 或者 ls-files -o - CB Bailey
git ls-files -o 会递归显示未暂存目录下的文件,而 git status 只会显示顶级目录。如果要将其替换为 git status,需要组合 git diffgit ls-files 的输出,并重新创建 git status 所提供的颜色编码等。我也非常希望能够找到解决方案! - Peter V. Mørch

14

最简单的解决方案:

  1. 进入目录
  2. git status | grep -v '\.\.\/'

当然,这会丢弃颜色。


如果需要的话,您可以进行一些修改来恢复颜色。示例1 示例2 - Carson

2
作为一条注释,如果你想要在不进入git目录的情况下检查git统计信息;
### 创建文件
sudo nano /usr/local/bin/gitstat
### 输入以下内容
#!/usr/bin/env bash
dir=$1
if [[ $dir == "" ]]; then echo "需要输入目录!" exit fi
echo "获取'$dir'的Git统计信息。"
git --git-dir=$dir/.git --work-tree=$dir diff --stat
### 赋予执行权限 sudo chmod +x /usr/local/bin/gitstat

并调用这个简单的脚本:gitstat /path/to/foo-project。当你在foo-project中使用时,也可以只输入gitstat .,这样会比git status -sgit diff --statgit diff --stat HEAD更短,如果你总是使用控制台而不是GUI。

致谢:


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