2014-02-13 79 views
60

特別是,我維護一個我的dotfiles的git倉庫。我最近開始研究一臺新機器,並在同一個機器上克隆我的存儲庫。Git忽略部分被跟蹤文件的本地更改

現在,我希望對我的點文件進行一些更改,這些點文件只針對該系統。我希望在我的存儲庫中忽略這些更改。

我做的其他更改應繼續進行跟蹤和承諾。

例如,在我的.gitconfig,我有一個設置:

[push] 
    default = simple 

現在,我的新機器上,使用的Git版本,它很老了。它仍然不支持推動設置simple。所以,我想改變這一點,但只在本地。

但是,如果我對.gitconfig做任何其他更改,我想跟蹤這些更改。無論如何,我能做到這一點?

編輯:
我知道git update-index --assume-unchanged。問題在於git將不再跟蹤我的文件,直到我將其反轉。然後,它會跟蹤所有的變化。
我希望忽略某些更改並跟蹤其餘部分。

+0

[Committing Machine Specific Configuration Files]可能的重複(http://stackoverflow.com/questions/1396617/committing-machine-specific-configuration-files) – Senseful

回答

9

我不相信有一個特定的命令會「解決」對文件的某些更改。但是,沒有理由不能創建一個本地分支,並將其從您的遙控器中進行更改,但不會發回任何更改。

+2

杜!這正是我需要的!將這些更改發送到分支!謝謝!我一直在過度工程這種情況。 – darnir

+0

或使用模板文件,例如:http://stackoverflow.com/a/1397180/32453 – rogerdpack

+1

請解釋。如果你有一個本地分支,你只需要修改內容,但是永遠不會發回任何更改,那麼如何將你在本地分支中所做的更改傳輸到主代碼庫? – Sophtware

140

嘗試使用這個命令:

git update-index --assume-unchanged FILENAME_TO_IGNORE 

扭轉它(如果你想提交更改的話),用途:

git update-index --no-assume-unchanged 

UPDATE

這裏是如何列表'不變'當前目錄下的文件:

git ls-files -v | grep -E "^[a-z]" 

由於-v選項將對'假定不變'文件使用小寫字母。

+0

'git update-index --assume-unchanged'的問題'是它將不再跟蹤我的文件,直到我將其反轉。然後,它會跟蹤所有的變化。 我希望忽略某些更改並跟蹤其餘部分。 – darnir

+1

@darnir據我所知,它在git中不可能。如何使用分支... – atupal

+2

然而,這正是我需要的情況!我的隊友使用的文件會減慢測試套件數十秒,所以我一直刪除它......但事實是它已經不再污染我的git會話。不過,不是! –

0

正如Peter建議的那樣,您可以在分支中保留這些機器特定的更改。很明顯,你必須小心地將這些機器特定文件的變化與「主線」分開。有2種方式這樣做:

  1. 保持基礎重建的分支,只要你改變主線(這將是我的偏好)
  2. 保持合併主線變成分支(但在其他明顯從未合併方向)
2

這是您的具體問題的替代解決方案。在~/.gitconfig.local文件置入機器的配置配置,然後把你的版本控制~/.gitconfig如下:

[include] 
    path = ~/.gitconfig.local 

這將讓Git對待任何它在~/.gitconfig.local發現好像是在~/.gitconfig。是的,你可以覆蓋設置。不,它不需要文件存在(如果沒有~/.gitconfig.local,Git會默默地忽略該設置)。

有關[include]的更多信息,請參閱here

我在Emacs,Zsh,Git,Tmux等我的配置中遵循此策略,以便它們可以自定義,而無需修改受版本控制的文件。爲了做到這一點,我有init.local.el,.zshrc.local, .gitconfig.local, .tmux.local.conf,等等。