2010-07-04 2 views
8

Sto cercando di modificare un po 'Qual è il modo più semplice per modificare file in conflitto in una volta sola quando si utilizza git e un editor come Vim o textmate?

Quando digito in git status sulla riga di comando, ho un elenco di file che devono essere risolti in questo modo:

# 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 

Esiste un modo semplice per passare questo elenco di percorsi di file in un editor di testo, in modo da poterli modificare tutti in una volta sola?

posso arrivare a questo, ad esempio, semplicemente tubazioni attraverso 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 

Ma io non sono sicuro di come restituire questo utilizzando solo comandi della shell, o se è più semplice per cadere in rubino o python, per passare ogni riga attraverso un'espressione regolare, per filtrare lo # both modified:.

Il risultato finale che voglio è qualcosa di simile:

vim #{space_separated_list_of_files} 

come sarebbe voi ragazzi fare questo?

risposta

10

Qui ci sono un paio di alias che ho nella mia gitconfig, tratto dal git wiki:

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`" 

Dovrebbe fare quello che vuoi!

+1

Penso che questo sia davvero utile e fantastico. Tuttavia, non gestisce gli spazi correttamente. Ecco una versione alla quale (alla fine) è venuto in mente che non si rompa dall'incontrare file con spazi nei loro nomi: '! F() {git ls-files --unmerged | cut -f2 | ordina -u | sed -r 's// \\\\/g'; }; f | xargs vim' – Destin

+1

@Destin Ci sono così tante cose che si romperanno se ci sono spazi nei nomi dei file; se controlli il progetto ti suggerirei di non inserire spazi nei nomi dei file. – Cascabel

+0

@Jefromi: vuoi dire che ci sono così tanti programmi che non possono gestire gli spazi nei nomi dei file, quindi dobbiamo aggirare evitando gli spazi. – siride

2

Shortest mi viene in mente:

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

Siete a conoscenza di comando git mergetool? Ciò non apre tutti i file in un colpo solo, ma itera su tutti i file necessari, che potrebbero essere solo ciò di cui hai bisogno. È anche possibile utilizzare vim per fare il merge

git mergetool --tool = vimdiff