2011-08-26 71 views
8

我經常遇到這樣的情況,我有git add編輯一組文件用於提交,但必須對這些文件進行修改,以便最終修改這些相同的文件在Changed but not updatedgit僅重新添加那些已經上傳的文件

有沒有可以執行到git add的單行文件只有Changed but not updatedChanges to be committed列表中存在的文件?

markdsievers$git status 
# On branch master 
# 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# modified: src/com/foo/Bar.java 
# modified: src/com/foo/Foo.java 
# 
# Changed but not updated: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
# modified: src/com/foo/Bar.java 
# modified: src/com/foo/Foo.java 
# modified: src/com/foobar/FooBar.java 

對於上面的例子中,我只希望Foo.javaBar.java但不FooBar.java添加到列表Changes to be committed:

+0

你在想'git add -u'以外的東西嗎? –

+0

'git add -u'似乎想要一個文件模式,否則它使用'.'來添加'Foobar.java'。是的,我可以添加一個文件模式來獲得我設計的例子,這種方法可行,但改變很少如此簡單,單個文件模式就可以工作。 – markdsievers

回答

4

這是一種方式:

git add -u $(git status --porcelain | grep ^MM | cut -d ' ' -f 2) 
+0

嗨,謝謝你。不知道' - 瓷器'。我不認爲這是一個不合理的功能要求從Git,但也許是我的工作流程需要調整。 – markdsievers

+0

這對我來說不太適用......它試圖添加已修改但尚未上演的文件。 – Darien

+0

+1!但它只能在git根目錄下工作,而使用'git status -s',它可以在任何目錄下工作。 – pktangyue

0

如果文件名包含空格接受的答案將無法正常工作。此外-u在這種情況下無用,但是如果沒有文件都在Changed but not updatedChanges to be committed列表中,則會添加所有未分檔的文件。使用這個來代替:

git add $(git status -z | perl -0ne 'print $1 if $_ =~ /^MM(.*)$/') 

這將僅適用於那些只改變文件的工作。如果你想這對於被刪除文件的工作,增加,重新命名或複製爲好,使用此:

git add $(git status -z | perl -0ne 'print $1 if $_ =~ /^[MADRC][MD](.*)$/') 

但要小心最後一個。例如,如果文件被添加到索引中,但其刪除被取消,則運行此命令也會刪除索引中的文件,導致您丟失該文件的內容。

請注意,兩者都只能從你的git倉庫的根目錄工作。

相關問題