2014-09-30 95 views
2

在我的mac根目錄下,我有我的.bashrc,.aliases,.zshrc ...,然後在另一個文件夾中,我有一個同名點文件的git存儲庫。當我更新根目錄時,我也更新了git回購(手動)。有什麼方法可以將根文件夾中實際實現的點文件「鏈接」到git repo,因此我只需處理一個更改?Git跟蹤點文件(例如:.zshrc)

回答

3

你實際上可以用ln'鏈接'這些文件。您可以使用符號鏈接(-s)或硬鏈接。如果您使用UNIX(如系統),您應該瞭解鏈接。

符號鏈接是包含路徑(相對或絕對)的基本特殊文件,並且被系統視爲它們是該路徑上的文件(這意味着符號鏈接可能會被破壞)。

硬鏈接(由ln創建而沒有-s標誌)僅限於單個文件系統,硬鏈接只是與原始文件相同字節塊的名稱。硬鏈接與原始文件無法區分。實際上,文件只是硬鏈接(= inode的名稱),其計數爲1.(ls -l列表中的第二列顯示了給定文件在文件系統上存在的硬連接數(名稱)數。)

我也把我的dotfiles放入回購。在我的回購中。我在一個名爲​​的目錄中有點文件,我的回購還包含一個腳本,它將dotfiles的​​鏈接到我的主目錄。

該腳本如下:

#!/bin/bash 
    shopt -s dotglob #make globbing catch dotfiles too 
    #Use -f (force) to overwrite targets 
    for file in payload/*; do ln -s .${PWD/$HOME/}/$file $HOME/; done #use string substitution 

編輯 我發現一個簡單的方法來獲得在鏈接的相對路徑是使用-r選項ln

for file in payload/*; do ln -s -r $file $HOME/; done 

也可以使用ln的第三種形式(請參閱man ln)一次創建多個鏈接:

ln -s -r payload/* $HOME/ 

對於硬鏈接的版本,你可以這樣做:

#!/bin/bash 
shopt -s dotglob #make globbing catch dotfiles too 
ln payload/* $HOME/ 

(此硬鏈接的版本將不會與移動破碎和重命名,但你的回購必須是在同一文件系統)

(所有這些假定您只有payload/中的文件(不是目錄),並且您的鏈接應該與其目標具有相同的名稱。)

還有更復雜的程序s更加強大的方式。

+1

我會使用硬鏈接;如果沒有別的,它允許你(重新)移動git倉庫而不刪除實際的文件。 – chepner 2014-09-30 15:06:13

+0

@chepner:好點。我沒有想到這一點。我已經用硬鏈接版本和硬鏈接的解釋修改了我的答案。 (因爲這個問題基本上都是關於鏈接的)。 – PSkocik 2014-09-30 15:40:44

+0

不會破壞硬鏈接? (https://codingkilledthecat.wordpress.com/2012/08/08/git-dotfiles-and-hardlinks/,http://stackoverflow.com/questions/3729278/git-and-hard-links#3731139) – 2017-03-24 17:33:55

4

symbolic link怎麼樣?

只要刪除該文件在你的根,並重新創建它們作爲

ln -s /physical/path/to/file /symbolic/link/path 

例如,如果你有文件/git/.aliases,ln -s /git/.aliases /root/.aliases將創建的文件夾root稱爲.aliases的符號鏈接。從這一點開始,無論您修改哪個文件(/git/root),都會修改另一個文件。

查看this link瞭解符號鏈接和Mac的更多詳細信息。

請原諒我的隨機路徑,我不是Mac用戶。

3

我通常用符號鏈接對於這一點,如:

mkdir ~/.dotfiles 
mv ~/.zshrc ~/.dotfiles 
ln -s ~/.dotfiles/.zshrc ~/.zshrc 
cd ~/.dotfiles ; git init ; ...etc... 

..所以說,實際上被打開的文件是在〜/ .dotfiles目錄版本控制下的一個。

另一種選擇是使用特定應用程序 「包括」 的特點,如:

  • 把你的 「標準」 配置~/.dotfiles/.zshrc
  • 源,從~/.zshrc文件:

    [ -e ~/.dotfiles/.zshrc ] && . ~/.dotfiles/.zshrc