如何使用git打开所有修改过的文件?

19

如何打开自上次git提交以来已删除、修改和创建的所有文件,我先尝试使用git status命令,但很难解析,所以我发现git status --porcelain更容易解析,并且结合awk + vim + 一些bash魔法,做起来很容易。


2
打开一个已删除的文件是什么意思? - unwind
a.rb已被删除,vim a.rb将打开一个空文件,保存它将创建一个空白文件,不做任何操作只是用来注意到文件已被删除。 - Dorian
4个回答

39

所以,我用 vim 找到了解决方案:

vim $(git status --porcelain | awk '{print $2}')

我发布这个问题和答案只是为了自己回答并分享到互联网上。


反引号已经被弃用。 - user4453924
@HolgerJust,您在此网站引用了一个并不能证明任何事情的答案。但是无论如何,即使它们没有被弃用,它们也已经过时,并且与$()相比没有任何优势,而$()则有许多优势。唯一使用它们的原因是为了与旧的Bourne Shell兼容。此外,如果您阅读该帖子的顶部评论,我持有相同的观点。 - user4453924
我不知道,我只是觉得反引号更短更容易写,但是是的,$() 看起来更易读。 - Dorian
4
尝试使用 git ls-files -o -m --exclude-standard 命令作为 Git 命令。它包括新文件,并且不需要 awk 步骤。 - ruuter
2
与 @ruuter 的命令 git diff HEAD --name-only 不同,该命令列出了已缓存和未缓存的更改。 - ConorSheehan1
1
当您在子文件夹中时,请执行以下命令:vim $(git status --porcelain -s | awk '{print $2}') - prehistoricpenguin

9
为了让这个命令在 git 仓库的子文件夹中起作用,只需在 git status 命令中加上 -s 选项即可。Vim 的 -O 选项可以将文件垂直拆分打开。 vim -O $(git status -s | awk '{print $2}')

2
你应该在vim命令中使用-p标志而不是-O来打开它们以在选项卡中显示,因为如果你有超过2个修改的文件,你的vim屏幕将会被分割成很多部分。 - betoharres
这非常方便! - prehistoricpenguin

8

您可以从这篇博客中学习,编辑~/.gitconfig文件并添加以下内容:

[alias]
  edit = !$EDITOR $(git status --short | awk '$1 ~ /^M|A|U/ {print $2}' )

现在,git edit将打开所有已修改的文件。

使用 --porcelain 可能更好,因为输出将不受配置的影响而保持一致,... - edi9999
1
@edi9999 --porcelain与当前工作目录无关,这可能是使用--short的有效原因。 - Andy E
3
对于 Git 别名,我会给一个加一的支持。但是对于 Git 命令,我宁愿使用 git ls-files -o -m --exclude-standard,它包括新文件且不需要 awk 步骤。 - ruuter
1
我使用了!$EDITOR $(git d $1 --name-only)作为别名,这将允许您打开与其他命名分支不同的文件,如果留空则打开HEAD。 - smilingfrog

5
git ls-files --modified --deleted --others -z | xargs -0 vim

1
我从 tmp/ 目录下得到了很多在我的 .gitignore 文件中的文件。 - Dorian
我建议使用 git ls-files -o -m --exclude-standard 命令来打开修改过和新增的文件,但排除忽略的文件。对于我而言,使用 xargs 命令无法与 vim 协同工作(将所有文件名作为一个字符串管道传输到 vim 中作为新文件,并阻塞终端输入),而 vim $() 命令可以很好地解决这个问题。 - ruuter

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