使用类似于Git和Vim或Textmate之类的编辑器时,一次性编辑冲突文件的最简单方法是什么?

9

我将尝试对其进行微调。

当我在命令行中输入git status时,会得到一个需要解决的文件列表,如下所示:

# Unmerged paths: #
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add <file>..." to mark resolution)
#
#   both modified:      apache2/templates/default/apache2.conf.erb
#   both modified:      bootstrap/attributes/default.rb
#   both modified:      iptables/metadata.rb
#   both modified:      kickstart/templates/default/ks.cfg.erb
#   both modified:      openssl/metadata.json
#   both modified:      postfix/metadata.json
#   both modified:      postfix/templates/default/main.cf.erb

有没有一种简单的方法将这个文件路径列表传递到文本编辑器中,以便您可以一次性编辑它们?例如,我可以通过将其直接输入grep来实现:
[17:37]:git status | grep "both modified"
#   both modified:      apache2/templates/default/apache2.conf.erb
#   both modified:      bootstrap/attributes/default.rb
#   both modified:      iptables/metadata.rb
#   both modified:      kickstart/templates/default/ks.cfg.erb
#   both modified:      openssl/metadata.json
#   both modified:      postfix/metadata.json
#   both modified:      postfix/templates/default/main.cf.erb

但我不确定如何仅使用Shell命令返回此内容,或者是否最简单的方法是进入Ruby或Python,通过正则表达式传递每行,过滤掉# both modified:

我想要的最终结果类似于这样:

vim #{space_separated_list_of_files}

你们会如何处理这个问题?
3个回答

13

以下是我在gitconfig中使用的一对别名,取自Git维基

edit-unmerged = \
    "!f() { git ls-files --unmerged | cut -f2 | sort -u ; }; vim `f`"
add-unmerged = \
    "!f() { git ls-files --unmerged | cut -f2 | sort -u ; }; git add `f`"

应该可以达到你想要的效果!


2
我认为这非常有帮助和棒极了。然而,它不能正确处理空格。这是我最终想出来的一个版本,可以避免在文件名中包含空格时出现错误:!f() { git ls-files --unmerged | cut -f2 | sort -u | sed -r 's/ /\\\\ /g' ; }; f | xargs vim - Destin
1
@Destin 如果文件名中有空格,将会导致许多问题出现;如果你控制这个项目,我建议一开始就不要在文件名中使用空格。 - Cascabel
@Jefromi:你的意思是有很多程序无法处理文件名中的空格,因此我们必须避免使用空格来解决这个问题。 - siride
@Destin:这在 msysgit/Git for Windows 上不起作用。 - siride
在vim中打开它们(因为我在windows上启动Neovim时没有使用命令行)。 我使用 :execute 'args ' . system('git unmerged | paste -sd \" \" -')。我的unmerged命令与Destin的评论中的命令相同,但不会将结果导入vim,所以它会将文件分别输出到单独的行。paste -sd部分将文件放在一行上以供args命令使用。(或者您可以使用tabe) - TamaMcGlinn

3

我能想到的最短的方式:

vim `git status|grep 'both modified'|cut -d: -f2`

2

你是否了解 git mergetool 命令?它不会一次性打开所有文件,而是迭代处理所需的文件,这可能正是你需要的。你甚至可以使用 vim 进行合并。

git mergetool --tool=vimdiff


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