2010-07-04 10 views
8

Tôi đang cố gắng để tinh chỉnh một chútCách đơn giản nhất để chỉnh sửa các tệp mâu thuẫn trong một lần khi sử dụng git và một trình soạn thảo như Vim hoặc bạn văn là gì?

Khi tôi gõ vào tình trạng git trên dòng lệnh, tôi nhận được một danh sách các tập tin mà cần phải được giải quyết như sau:

# 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 

Có một cách đơn giản để chuyển danh sách đường dẫn tệp này vào trình chỉnh sửa văn bản, để bạn có thể chỉnh sửa tất cả trong một lần?

tôi có thể tới này ví dụ, bằng cách đơn giản đường ống thông qua 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 

Nhưng tôi không chắc chắn làm thế nào để trở lại này chỉ sử dụng shell lệnh, hoặc cho dù đó là đơn giản nhất để thả vào ruby ​​hoặc python, để vượt qua từng dòng thông qua một regexp, để lọc ra # both modified:.

Kết quả cuối cùng tôi muốn là một cái gì đó như thế này:

vim #{space_separated_list_of_files} 

Làm thế nào các cậu sẽ làm điều này?

Trả lời

10

Dưới đây là một cặp bí danh tôi có trong gitconfig của tôi, lấy từ 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`" 

Nên làm những gì bạn muốn!

+1

Tôi nghĩ điều này thực sự hữu ích và tuyệt vời. Tuy nhiên, nó không xử lý không gian đúng cách. Dưới đây là một phiên bản mà tôi (cuối cùng) đã đưa ra rằng không phá vỡ từ gặp phải các tập tin với không gian trong tên của họ: '! F() {git ls-files --unmerged | cắt -f2 | sắp xếp -u | sed -r 's// \\\\/g'; }; f | xargs vim' – Destin

+1

@Destin Có rất nhiều thứ sẽ bị hỏng nếu bạn có không gian trong tên tập tin; nếu bạn kiểm soát dự án, tôi khuyên bạn không nên đặt không gian trong tên tập tin ngay từ đầu. – Cascabel

+0

@ Jefromi: bạn có nghĩa là có quá nhiều chương trình không thể xử lý các khoảng trống trong tên tệp, vì vậy chúng tôi phải giải quyết nó bằng cách tránh các khoảng trống. – siride

2

Shortest tôi có thể nghĩ:

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

Bạn có biết lệnh git mergetool? Điều đó không mở tất cả các tệp trong một lần, nhưng lặp lại trên tất cả các tệp cần thiết, có thể chỉ là những gì bạn cần. Bạn thậm chí có thể sử dụng vim để làm việc hợp nhất

git mergetool --tool = vimdiff