2012-04-04 66 views
17

在git中,是否有任何(簡單)的方式來修改索引,以便只添加已經在其中的文件的更改?這聽起來很複雜,但我想實現的很簡單。刷新分段文件

比方說我的指數看起來像這樣(略剝離git status輸出):

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

一些變化B在索引中,有些則不是。 C根本沒有上演。

如何在不添加C的情況下更新索引中的B(階段未分級更改)?

I.e.我想該指數將是這樣的:

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

在它當然可以用一個簡單的git add B實現這個簡單的例子,但我想知道是否有針對一般情況下一個簡單的答案。我試過git add --refresh,但是如果我理解正確,那隻會更新統計信息。

+0

你能告訴一個真正的用例你想這麼做?我無法想象任何(當我添加一個文件,而不是更改它時,它並不意味着我會想要添加這些更改,特別是當我不想在其他文件中添加更改時)。 – 2012-04-04 08:34:32

+0

@JanHudec我可能不會需要這個,如果我更嚴格,只接觸那些應該在提交('B')中進行的文件。然而,有時候我會被帶走並開始進行新的提交('C')的更改,所以我在索引中添加了'B'。在提交之前,我總是檢查diff - 緩存,有時候會用'B'清理一些東西。那時候我需要這個。我想這可能可以通過另一種方式解決,比如隱藏 – axelarge 2012-04-04 09:09:35

+0

我的觀點是,當你正在執行文件'X'中的某些內容時,應該提交'B'並將其帶走並做出應該提交的更改'C',其中一些變化通常是再次提交'X'。在這種情況下,您想要手動添加-i個人區塊,而不是僅添加文件「X」。顯然,如果你被帶走了,你可能會注意到你正在改變的一點,這就是爲什麼額外的改變不會觸及第一組文件所做的文件。 – 2012-04-04 09:39:08

回答

22

以下命令將更新索引包含尚未上演然而在B中的其他變化:

git update-index --again 
+1

啊,比我的方法更好! – torek 2012-04-04 19:16:09

+0

完美!這正是我需要的 – axelarge 2012-04-05 08:33:03

1

我不知道的完全瑣碎的方式來做到這一點,但:

git status --porcelain 

會顯示文件B(只有B)作爲國家 「MM」,所以:

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

將產生這樣的文件的列表。

儘管如此,「重新添加」A沒有任何壞處。您可以使用git diff-index --cached --name-status HEAD。 (可能需要這個,如果你的Git是太老了,git status --porcelain。)

+0

謝謝,我不知道 - 瓷器的狀態。 – axelarge 2012-04-04 09:14:11

+0

它目前與-s/--short相同,但承諾會繼續保持機器分析能力,如果將其粘貼到某個腳本中,這一點很重要。 :-) – torek 2012-04-04 09:28:04

+0

我試過'git status --porcelain | grep^[AM] M |切割-d''-f 2- | xargs git add',但它失敗,文件名包含空格。我想這可能被視爲另一個問題,但也許你可以幫忙?使用xargs -0它根本不起作用 – axelarge 2012-04-04 09:54:42