2010-12-17 63 views
342

我在變更集中有一堆文件,但我想特別忽略單個修改後的文件。看起來這git status後:將所有文件添加到除單個文件之外的提交?

# modified: main/dontcheckmein.txt 
# deleted: main/plzcheckmein.c 
# deleted: main/plzcheckmein2.c 
... 

有沒有辦法我可以做git add只是忽略了一個文本文件,我不想碰?喜歡的東西:

git add -u -except main/dontcheckmein.txt 

回答

510
git add -u 
git reset -- main/dontcheckmein.txt 
+18

如何排除整個文件夾? - 主要或主要/或主要/ *? – 2013-11-23 09:08:20

+1

@MariusKavansky你可以使用所有這些形式。如果你使用'main/*',需要在它前面加上'--',讓git知道它是一條路徑。其他兩種變體的工作方式不包括兩個破折號。 (在帶有msysGit的Windows 7上的命令提示符下進行測試) – dennisschagt 2014-11-08 14:06:25

+2

如果您想要排除包含大量文件或其他文件夾的文件夾,請暫時將它們添加到您的gitignore中。之後對這些文件夾執行'''git reset'''仍然可以工作,但是添加大文件夾需要很長時間。 – 2015-05-13 13:24:17

17

雖然本·傑克遜是正確的,我以爲我想補充我怎麼一直在使用該解決方案,以及。下面是一個非常簡單的腳本,我使用它(我稱之爲gitadd)來添加所有更改,除了我保留在名爲.gittrackignore(非常類似於.gitignore的工作方式)的文件中。

#!/bin/bash 
set -e 

git add -A 
git reset `cat .gittrackignore` 

這就是我目前的.gittrackignore長相。

project.properties 

我正在開發部署時從命令行編譯的Android項目。這個項目依賴於SherlockActionBar,因此它需要在project.properties中引用,但是編譯混亂,所以現在我只需鍵入gitadd並將所有更改添加到git,而不必每次都不添加project.properties 。

+0

難道你錯過了' - '從你的命令嗎? – 2013-12-19 16:36:17

+0

直到您的評論,我才知道「 - 」是什麼。根據手冊頁,它是可選的,不會改變命令的結果(至少在這種情況下)。這個問題似乎支持, http://stackoverflow.com/questions/17800994/git-two-dashes-means-with-no-more-options。 糾正我,如果我錯了,但它似乎意味着「後處理任何' - '作爲參數,而不是選項/開關」 – 2013-12-19 20:41:47

+0

在'git checkout'中很好地使用' - '我在這個問題中看到。在我們交換之前,我不知道雙重衝刺是什麼。我想知道分支和文件之間的'git checkout'歧義是否會以這種或者不同的形式影響'git reset'。 – 2013-12-20 00:06:29

83

1)要啓動忽略改變到單個已經版本文件

git update-index --assume-unchanged "main/dontcheckmein.txt" 

和撤消git update-index --no-assume-unchanged "main/dontcheckmein.txt"

check here

2)向完全忽略某一特定的單一文件防止它來自在存儲庫處創建的

在此Git global ignore not working

,並在.gitignore首先要看添加相對路徑的文件,而不會導致./

,所以如果你的文件是在MyProject/MyFolder/myfile.txt(其中.git也是在MyProject),在.gitignore你把眼前這個MyFolder/myfile.txt

可以確認什麼規則與與忽略git check-ignore "MyFolder/myfile.txt"

關於全局忽略

該鏈接說的是~/.gitignore_global;但該文件與您的項目有關;所以,如果你把在~/.gitignore_global排除模式MyFolder/myfile.txt,它會工作,但不會太大的意義......

在另一方面,如果你設置與git config core.excludesfile .gitignore您的項目中,.gitignoreMyProject;該設置將覆蓋~/.gitignore_global,該設置可以有very useful rules ...

所以,現在我認爲最好的辦法是製作一些腳本,將.gitignore~/.gitignore_global混合在.gitignore

最後一個警告
如果你想忽略該文件已經在庫中,這種方法不會,除非你做這方面的工作:git rm "MyFolder/myfile.txt",但第一次備份,因爲它會在本地也刪除!您可以複製回來後...

+3

您可以使用'git rm --cached MyFolder/myyfile.txt'從存儲庫中刪除該文件,但將其保留在本地。 [help.github.com上的說明](https://help.github.com/articles/ignoring-files/) – dennisschagt 2014-11-08 13:55:04

35

一個文件

git add -u 
git reset -- main/dontcheckmein.txt 

一個文件夾

git add -u 
git reset -- main/* 
0

我用git add --patch頗有幾分希望這樣的事情,以避免必須始終通過相同的文件命中d。我掀起了一個非常哈克夫婦git的別名把工作做:

[alias] 
    HELPER-CHANGED-FILTERED = "!f() { git status --porcelain | cut -c4- | ([[ \"$1\" ]] && egrep -v \"$1\" || cat); }; f" 
    ap      = "!git add --patch -- $(git HELPER-CHANGED-FILTERED 'min.(js|css)$' || echo 'THIS_FILE_PROBABLY_DOESNT_EXIST')" 

在我來說,我只是想忽略某些縮小的文件,所有的時間,但你可以把它使用環境變量像$GIT_EXCLUDE_PATTERN爲一個更一般的用例。

2

試試這個:

git的結帳 - 主/ dontcheckmein.txt

0

對於這個問題的具體情況,這將添加的所有文件與.C擴展和其他離開了一切:

git add *.c 

git-scm(或/和man git add):

混帳添加<pathspec> ...

文件從添加內容。可以給Fileglobs(例如* .c)添加所有匹配的文件。 < ...>

注意,這意味着,你也可以這樣做:

git add **/main/* 

補充,是在main文件夾中的所有文件(即不忽略)。你甚至可以去野外像這樣的東西:

git add **/s?c/*Service* 

補充說,在s(any char)c文件夾,並在其文件名具有Service地方的所有文件。這link可能會給你一些glob模式的想法。

當我做出很多改變時,我發現它特別有用,但仍然希望我的提交保持原子性並反映漸進過程,而不是我當時可能正在工作的變化的對衝。當然,在某些時候,提出精心製作的模式的成本要比使用簡單方法添加文件的成本要高得多。

順便說一句,你可能需要引用你的glob模式爲他們工作,但這從來沒有我的情況。

相關問題