2012-08-02 49 views
7

我正在嘗試創建一個git存儲庫來存儲我所有的dotfiles和配置文件。我的想法是簡單地創建所有我關心的文件的硬鏈接,並將這些鏈接存儲在他們自己的目錄中,以便我可以變成一個存儲庫。不能硬鏈接gitconfig文件

雖然我的〜/ .gitconfig文件已經打到了一些障礙。似乎每當我運行'git config'命令時,我創建的鏈接都不再指向正確的位置,例如存儲庫中的文件不再正確更新。

這是一個使用shell和交互式ruby來確定文件鏈接狀態的例子。

# Create the link 
$ ln .gitconfig .conf_files/gitconfig # Create the link 

# The files are in fact linked 
[1] pry(main)> File.identical?('.gitconfig', '.conf_files/gitconfig') 
=> true 

# Update the gitconfig file by running a 'git config' command 
$ git config --global alias.last 'log -1 HEAD' 

# The files are no longer linked. 
[2] pry(main)> File.identical?('.gitconfig', '.conf_files/gitconfig') 
=> false 

我認爲這與git編寫.gitconfig文件的方式有關。有誰知道爲什麼會發生這種情況,或者有什麼創意來解決這個問題?

+1

git config打破硬鏈接。改爲使用符號鏈接。 – 2012-08-02 22:22:03

+0

@William Pursell糾正我,如果我錯了,但我不認爲git識別符號鏈接? – 2012-08-02 22:24:36

+2

將實際的文件放入git存儲庫,然後在$ HOME中放入一個符號鏈接。 git永遠不會看到軟鏈接。 – 2012-08-02 22:59:37

回答

6

嘗試禮Barzilay在他的評論溶液中http://www.xxeo.com/archives/2010/02/16/dotfiles-in-git-finally-did-it.html

所以,我終於找到了一個解決方案,將兩個最好的:把回購 在一個子目錄,而不是符號鏈接,添加配置選項 「core.worktree」是您的主目錄。現在,當你在你家 目錄中時,你不在git倉庫中(所以第一個問題已經消失),而你的 不需要像第二種情況那樣處理脆弱的符號鏈接。你還有 有排除你不想版本化的路徑的麻煩(例如,「.git/info/exclude」技巧中的「*」),但這並不新鮮。

+0

這很好用!它修復了被認爲是git命令的git repo的每條路徑的問題,避免了需要使用任何類型鏈接的問題,而且您不必混淆文件系統的根目錄。我在'.conf_files/.git/info/exclude'的回答中移動了.gitignore文件的內容,它的工作方式就像一個魅力。非常感謝! – 2012-08-03 13:39:57

2

這是完全正常的,實際上是覆蓋配置文件的推薦方式。 Git創建一個臨時文件,寫出配置,然後將新文件移到舊文件上。這樣,如果Git被中斷,你不會得到一個不完整的配置文件(數據丟失)。

您總是可以編寫一個腳本來將您的配置文件複製或鏈接到您的中央存儲庫。

+0

這將有助於爲什麼硬鏈接斷裂,但我希望可能有一個更簡單/更清潔的方式來保持文件相同。 – 2012-08-02 22:27:06

+0

@MattGarriott:這裏真正的問題是,你正試圖使用​​Git來跟蹤*不能在Git倉庫中的文件。這只是目前文件系統設計方式的根本限制,也是Git設計的方式。我會考慮一個腳本「簡單而乾淨」的方式來做到這一點。無論如何,Git都是一堆腳本。另一種方法是讓Git跟蹤其存儲庫之外的文件 - 儘管這在技術上是可行的,但您需要了解圍繞Git管道的方法。 – 2012-08-02 22:57:18

+0

你是絕對正確的,這就是爲什麼我決定從不同的角度來解決這個問題,我已經附上了我的新解決方案作爲對這個問題的答案。感謝您的所有解釋和幫助! – 2012-08-02 23:06:46

0

結帳這個答案,也許它可能會有所幫助:

https://stackoverflow.com/a/3731139/1431696

在此期間,你有沒有考慮做反向鏈接?創建充滿配置文件等的存儲庫,然後在你實際使用你的文件的地方創建一個到位於存儲庫中的「真實」文件的硬鏈接。

+6

硬鏈接是對稱的。他們不會倒退,因爲他們不會前進。 – 2012-08-02 22:24:30

+0

啊,看起來有點麻煩。 – wardd 2012-08-02 22:25:37

0

由於迪特里希埃普的回答和建議,我決定通過創建我的文件系統的根庫,並使用的.gitignore只跟蹤我感興趣的文件從一個不同的角度來處理這個問題。

我的.gitignore文件現在看起來是這樣的:

/* 

!/etc/ 
/etc/* 

# etc files 
!/etc/rc.conf 
!/etc/asound.conf 
!/etc/mercurial/ 

!/home/ 
!/home/matt/ 
/home/matt/* 

# Home files 
!/home/matt/.xinitrc 
!/home/matt/.gitconfig 
!/home/matt/.bashrc 

# Vim files 
!/home/matt/.vimrc 
!/home/matt/.vim/ 
.netrwhist 

除了沒有將文件複製分開,並讓他們在兩個不同的位置,這具有我需要我可以輕鬆地恢復更改,而不必利益以手動複製文件。

感謝您的幫助!