2012-04-04 35 views
17

Trong git, có cách nào (đơn giản) để sửa đổi chỉ mục để chỉ những thay đổi đối với các tệp đã có trong đó được thêm vào không? Nghe có vẻ phức tạp, nhưng những gì tôi muốn đạt được là đơn giản.Làm mới các tệp được dàn dựng

phép nói rằng chỉ số của tôi trông như thế này (hơi bị tước git status đầu ra):

# Changes to be committed: 
#  modified: A 
#  modified: B 
# 
# Changed but not updated: 
#  modified: B 
#  modified: C 
# 
# Untracked files: 
#  D 

Một số thay đổi để B có trong chỉ mục, một số thì không. C không được dàn dựng.

Làm cách nào để cập nhật B trong chỉ mục (giai đoạn các thay đổi chưa được ghi) mà không cần thêm C?

I.e. Tôi muốn cho các chỉ số để trông như thế này:

# Changes to be committed: 
#  modified: A 
#  modified: B 
# 
# Changed but not updated: 
#  modified: C 
# 
# Untracked files: 
#  D 

Trong trường hợp này đơn giản, nó có thể đương nhiên đạt được với một đơn giản git add B, nhưng tôi muốn biết nếu có một câu trả lời đơn giản cho trường hợp tổng quát. Tôi đã thử git add --refresh, nhưng nếu tôi hiểu chính xác, chỉ cập nhật thông tin stat.

+0

Bạn có thể hiển thị một trường hợp sử dụng thực sự nơi bạn muốn làm điều đó? Tôi không thể tưởng tượng bất kỳ (khi tôi thêm một tập tin và sửa đổi nó nhiều hơn, nó không tự động có nghĩa là tôi sẽ muốn thêm những thay đổi quá, đặc biệt là khi tôi sẽ không muốn thêm thay đổi trong một số tập tin khác). –

+0

@JanHudec Tôi có lẽ sẽ không cần điều này nếu tôi chặt chẽ hơn và chỉ chạm vào những tệp cần đi vào trong cam kết ('B'). Tuy nhiên đôi khi tôi bị mang đi và bắt đầu thực hiện các thay đổi cần có trong một commit mới ('C'), vì vậy tôi thêm' B' vào chỉ mục. Trước khi bắt đầu, tôi luôn xem xét lại những thứ khác biệt và đôi khi làm sạch trong 'B'. và đó là khi tôi cần điều này. Tôi đoán nó có thể có thể được giải quyết theo cách khác, nói với stash – axelarge

+0

Điểm của tôi là, khi bạn đang làm một cái gì đó trong tập tin 'X' mà nên đi trong cam kết' B' và được mang đi và làm thay đổi mà nên đi trong cam kết 'C', một số thay đổi đó thường là một lần nữa để tập tin' X'. Trong trường hợp này bạn muốn thêm -i từng khối riêng lẻ theo cách thủ công và không chỉ thêm lại tệp 'X'. Rõ ràng nếu bạn bị mang đi, bạn có thể nhận thấy một cái gì đó xung quanh điểm bạn đang thay đổi, đó là lý do tại sao nó không thể thay đổi thêm không chạm vào các tập tin nắm tay không. –

Trả lời

22

Lệnh sau sẽ cập nhật các chỉ số để chứa các thay đổi khác trong B mà chưa được dàn dựng nào:

git update-index --again 
+1

Ah, cách tốt hơn so với phương pháp của tôi! – torek

+0

Hoàn hảo! Đó chính xác là những gì tôi cần – axelarge

1

Tôi không biết một cách hoàn toàn tầm thường để làm điều này, nhưng:

git status --porcelain 

sẽ hiển thị tập tin B (và chỉ B) là trạng thái "MM", vì vậy:

git status --porcelain | grep ^MM | cut -d' ' -f 2 

sẽ tạo danh sách các tệp như vậy.

Không có hại trong việc "thêm lại" A.

Bạn cũng có thể sử dụng git diff-index --cached --name-status HEAD. (Có thể cần điều này nếu git của bạn quá cũ để có git status --porcelain.)

+0

Cảm ơn, tôi không biết về --porcelain cho trạng thái. – axelarge

+0

Hiện tại nó giống như -s/--short, nhưng hứa hẹn sẽ tiếp tục có khả năng phân tích bằng máy, điều quan trọng nếu bạn gắn nó vào một số tập lệnh. :-) – torek

+0

Tôi đã cố gắng 'git status --porcelain | grep^[AM] M | cắt -d '' -f 2- | xargs git add', nhưng không thành công với tên tập tin chứa dấu cách.Tôi đoán điều này có thể được xem như một câu hỏi khác, nhưng có lẽ bạn có thể giúp đỡ? Với xargs -0 nó không hoạt động ở tất cả – axelarge

Các vấn đề liên quan