Git 跟踪符號連結的點文件
我將我的 dotfiles 保存在 bitbucket 上的私人 git repo 中,這對我的大多數文件(.vimrc、.tmux.conf 等)非常有用,然後我只需將我的主目錄中的符號連結設置到我的 dotfiles 的複製 gitrepo 並且一切正常偉大的。
我的問題是我也使用 prezto 框架來管理 zsh 外掛。Prezto 做了類似的事情,它將所有 .zprezto* 配置文件儲存在自己的目錄中,並從家中連結到它們。其中一個文件是 .zshrc,它儲存在自己的目錄中。
它看起來像這樣:
.zlogin -> /home/jordan/.zprezto/runcoms/zlogin .zlogout -> /home/jordan/.zprezto/runcoms/zlogout .zpreztorc -> /home/jordan/.zprezto/runcoms/zpreztorc .zprofile -> /home/jordan/.zprezto/runcoms/zprofile .zshenv -> /home/jordan/.zprezto/runcoms/zshenv .zshrc -> /home/jordan/.zprezto/runcoms/zshrc
我如何能夠在我自己的 git dotfiles 目錄中跟踪我的 .zshrc 文件而不破壞 prezto。
在這種情況下,您可以使用硬連結,假設您沒有跨越文件系統邊界。如果您不知道,硬連結很像符號連結,但從程序的角度來看,該文件是一個普通文件。這包括 git,它將與它們一起正常工作並將它們存檔為具有內容而不是符號連結的普通文件。
由於 git 不跟踪此類連結,但是,如果文件因某種原因被 repo 刪除並重新創建,它將破壞硬連結,因此在使用 git 時需要注意這一點。
明確地說,我的意思是您創建了一個從 Pretzo 的主要儲存實例到您保存 git 支持的點文件的目錄中的版本的硬連結。Pretzo 會將其視為正常文件,git 也會如此,並註意硬連結文件可以進行符號連結,因此它們的部署方式很好。
就像符號連結一樣,這意味著對一個版本的更改會更改另一個版本,因為從技術上講,它們是儲存上的相同數據(具有多個關聯的文件節點)。當心硬連結比符號連結更難注意到許多工具,因為它們通常沒有明確指出(我不知道這如何適用於各種 GUI 文件瀏覽器;我認為通常它們只是正常文件)。但是,您可以根據
ls -l
(第二列)stat
等顯示的連結數來發現它們。非硬連結的普通文件的連結數為 1(並且目錄不是普通文件,因此它們的連結數會有所不同)。 不幸的是,與符號連結不同,沒有簡單的方法可以找到其他節點,只是表明它們存在的連結計數。所以不要開始做這件事,要像在這種情況下那樣系統地做,這樣你就知道為什麼以及其他節點在哪裡。警告
這確實意味著,如果您以這種方式在多個系統上部署(您的文章在這一點上模棱兩可),如果Prezto傾向於自行更改這些文件,則可能會遇到問題。這將導致文件通過 a 掛起更新
pull
但這些與 Pretzo 所做的本地更改衝突的情況,並且此時合併可能很糟糕,因此您必須決定要做什麼(請注意,您可以刪除硬連結並且它不會刪除所有其他副本)。但是,如果這些都是您知道 Pretzo 只讀取而不使用的所有配置文件(這在 git 跨系統跟踪它們的想法中是隱含的),那麼您就可以了。此外,如果您只是將此 repo 用作一個特定係統的備份,那也沒關係,上述情況不會發生。
唯一的另一個問題是您不能跨文件系統邊界使用硬連結。即,如果您的主 git 支持的儲存位於與 Pretzo 自己的儲存分開的已安裝文件系統上,那麼您對這種方法不走運。