如何让git status仅显示已暂存的文件

108
我想要得到一个只包含已暂存文件名的列表。我找不到git status命令的--name-only等效标志。有什么好的替代方案吗?
文件列表会被管道传送到php -l(PHP语法检查器)。 解决方案:完整的命令
git diff --name-only --cached | xargs -l php -l

4
如果您正在手动运行该命令,那么您可能希望将其放入一个预提交钩子中。http://www.kernel.org/pub/software/scm/git/docs/githooks.html - Tyler
我认为这是对这个问题的更好答案:https://stackoverflow.com/a/10018751/14454560 - undefined
7个回答

158
使用git diff --name-only命令(带上--cached参数可以获取已经暂存的文件)。

4
你可以使用--name-status代替--name-only,它还会显示文件是修改、添加还是删除。 - wranvaud

25

被接受的答案不能让你知道都有哪些变化。

是的,如果你不是语法检查器而是一个拥有未暂存文件的存储库的普通人,并且你仍然想知道暂存文件会发生什么 - 还有另一条命令:

git status --short | grep '^[MARCD]'

这将导致类似于:

M  dir/modified_file
A  dir/new_file
R  dir/renamed -> dir/renamed_to
C  dir/copied_file
D  dir/deleted_file

很明显,这些文件是被暂存的,在执行git commit后:
deleted_file将被删除,
new_file将被添加,
renamed_file将成为renamed_to

以下是短格式输出的解释:https://git-scm.com/docs/git-status#_short_format


  1. 在我的版本(2.25.0.windows.1)中,“M”和“D”之前有一个空格。
  2. 还有另一种状态 - “??”,我不确定如何解释。
- itsho
@itsho 空格表示它没有被暂存。这个答案是正确的,因为它与行中的第一个字符匹配。如果第一个字符被设置,则它是已暂存的文件。如果它是一个空格,那么它会被忽略。 - Avner
2
这太聪明了!应该有一个Git标记来处理类似的事情。 - Norfeldt

10

@coffman21的回答启发,我在我的.zshrc中设置了以下别名:

alias gst="git status"
alias gst-staged="git status --short | grep '^\w.'"
alias gst-unstaged="git status  --short | grep '^\W.'"
alias gst-unstaged-tracked="git status  --short | grep '^\s.'"
alias gst-untracked="git status --short | grep '^??'"

或者

alias gst="git status"
alias staged="git status --short | grep '^\w.'"
alias unstaged="git status  --short | grep '^\W.'"
alias unstaged-tracked="git status  --short | grep '^\s.'"
alias untracked="git status --short | grep '^??'"

这可能对其他人也有用。因此将其添加到答案堆栈中。

1
为了保持一致的着色,您可以在grep中添加一个“.”,以同时着色前两个字符,例如:grep '^\w.'grep '^\W.'grep '^\s.' - geekley
没有必要在最后一个上面翻译,它已经有两个字符“??”。 - geekley
那个问题现在已经被修复了。再次感谢。 - Norfeldt

5

如何查看具有代码更改的暂存文件

git diff --staged   

或者使用--cached,它是--staged的同义词。

git diff --cached

或者仅查看文件名而不对代码进行更改

git diff --staged --name-only  

Git-diff 手册


2

查看已暂存的文件:

git ls-files

1
这似乎只显示当前目录中已提交的文件,而不是暂存的文件。 - paradroid

2

仅显示已暂存的文件

git status --porcelain --untracked-files=all | grep '^[A|M|D|R]'
  • --porcelain用于解析友好的输出。
  • --untracked-files=all 显示所有“未跟踪”的文件。显示已为提交而暂存的文件。
  • grep '^[A|M|D|R]' 过滤输出结果以显示
    • ^ 从新行开始进行匹配,每行的第一个字符表示暂存区域的状态,第二个字符表示工作树的状态。
    • A 新增
    • M 修改
    • D 删除
    • R 重命名

这是基于此评论


0

来自@velocity的消息
git diff --staged正是我想要的。如果有人想把它变成像git ds这样的快捷方式放在你的bashrc中,请参考以下示例:

git() {
    if [[ $@ == "ds" ]]; then
        command git diff --staged
    else
        command git "$@"
    fi
}

Git有自己的别名功能--你可以在~/.gitconfig中添加[alias](换行)ds = diff --staged,而不是使用bashrc方法。 - Justin

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