2011-08-19 79 views
432

我運行了「git status」,下面列出了一些修改過的文件或者在標題「未更改未提交的文件」下的文件。 它還列出了一些我想忽略的未跟蹤文件(我在這些目錄中有一個「.gitignore」文件)。git僅添加修改後的更改並忽略未跟蹤的文件

我想將修改後的文件放入分段中,以便我可以提交它們。當我運行「git add」時,它添加了修改後的文件以及我想要忽略的文件。

如何僅添加修改後的文件,並忽略未跟蹤文件(如果下面顯示的是git狀態)。

另外,我的「.gitignore」文件是否正常工作?

$ git status 
# On branch addLocation 
# Changes not staged for commit: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
#  modified: someProject/path/domain/viewer/LocationDO.java 
#  modified: someProject/path/service/ld/LdService.java 
#  modified: someProject/path/service/ld/LdServiceImpl.java 
#  modified: someProject/path/web/jsf/viewer/LocationFormAction.java 
#  modified: someProject/war/WEB-INF/classes/message/viewer/viewer.properties 
#  modified: someProject/war/page/viewer/searchForm.xhtml 
# 
# Untracked files: 
# (use "git add <file>..." to include in what will be committed) 
# 
#  .metadata/ 
#  someProject/build/ 
no changes added to commit (use "git add" and/or "git commit -a") 
+0

,如果你已經添加了的.gitignore文件後,你已經跟蹤文件,然後在.gitignore文件以不會忽視已被跟蹤的文件。這可能是一個問題。 – BKSpurgeon

回答

602

理想情況下你應該.gitignore防止在狀態正在顯示未跟蹤(而忽視)文件,添加使用git add等,所以我想請你糾正你.gitignore

你可以做git add -u,使其將階段修改和刪除的文件。

你也可以做git commit -a來只提交修改和刪除的文件。

請注意,如果您有2.0版本的Git並使用了git add .,那麼您需要使用git add -u .(請參閱「Difference of 「git add -A」 and 「git add .」)。

+53

興趣點,這('add -u')不會添加__only__'修改的'文件,它也「添加」'刪除的'..我目前正試圖阻止的東西。 –

+5

爲了只添加修改後的文件,我通常會回到頂部目錄,並在$(git diff --name-only --relative)中鍵入'for fil。做git add $ fil; done'。如果我使用它很多(我沒有),我會在我的'〜/ .bashrc'文件中爲這個做一個別名。當然,這隻能在bash中工作。 –

+4

沒有確定的答案,只有「爲大多數人工作」的答案?我必須使用另一個進程才能正確執行此操作?這是不是內置於git add?這似乎是想要做的一件常見事情。 – Samuel

4

你沒有說目前你的.gitignore是什麼,但是一個.gitignore在你的根目錄中有下面的內容應該有效。

.metadata 
build 
+2

我正在使用我的.gitignore所有的錯誤。我在每個想要忽略的目錄中都有一個空的.gitignore文件,而不是在其中包含內容的單個gitignore。 – Steve

+1

@Steve:如果每個'.gitognore'包含一個開始(忽略所有內容),這將起作用。但是頂級目錄中的單個'.gitignore'通常使用起來更加簡單,並且足夠了。 – maaartinus

60

這爲我工作:

#!/bin/bash 

git add `git status | grep modified | sed 's/\(.*modified:\s*\)//'` 

甚至更​​好:

$ git ls-files --modified | xargs git add 
+0

如果不打算重用組,則不需要分組(\(\)),並且在文件名前爲我留下空白。這並不會影響最終結果,但爲了設置示例,我使用了sed命令:sed's /.* modified:* //'。在Mac OS X 10.9.5上進行了驗證。 – Samuel

+0

@Samuel Grouping在測試表達式時很不錯。然後,我可以在方括號內打印匹配,看看我是對的。 – user877329

+1

@Ярослав你的解決方案添加修改和未跟蹤的文件,等於'git add -u',所以它不回答問題。 –

0

我正好試試這個,所以我可以看到文件列表第一:

git status | grep "modified:" | awk '{print "git add " $2}' > file.sh 

    cat ./file.sh 

執行:

chmod a+x file.sh 
    ./file.sh 

編輯:(見註釋) 這可以在一個步驟來實現:

git status | grep modified | awk '{print $2}' | xargs git add && git status 
+1

這可以通過一步完成:'git status | grep修改| awk'{print $ 2}'| xargs git add && git status' – meetalexjohnson

+0

是的我應該提供該解決方案,謝謝,我更新了這篇文章。 –

相關問題