在環境之間共享項目樹
為了節省空間和時間,我在網路驅動器上複製了一個大型項目樹作為硬連結,即
cp -a -r --link proj proj_B
(背景:它很大,需要從兩個不兼容的環境中重建,並且對指定中間位置和產品位置沒有很好的支持。所以這是一個在環境“B”中重建的快速技巧:複製後清理並重建來自“proj_B/obj”。兩個環境都在 LinuxMint 16 下)
這種方法的問題是編輯不會(可靠地)在這些樹之間共享,例如將編輯保存到“proj/foo.cpp”將使其指向一個新的 inode,而“proj_B/foo.cpp”仍將指向舊的(可能來自“save temp; mv orig temp2; mv temp orig; rm temp2”的避免損失模式)。
對於共享源,我想我需要源目錄的符號連結(但不僅僅是項目根目錄的符號連結,因為二進制目錄需要分開),例如:
cp -a -r --symbolic-link proj proj_B
然後取消連結二進制目錄(除了遞歸符號連結複製失敗,“只能在目前目錄中建立相對符號連結”。但類似的事情可以用“find -exec”來完成,或者只是投降並編寫腳本)
但在此之前,我想要一個健全性檢查:是否有更好的工具來解決這個問題(例如,一些術士級別的 rsync 標誌組合)?還是這種共享方法注定會以眼淚和失去數據而告終,我應該放棄使用兩個副本(當我發現我忘記在它們之間推送/拉取最新更改時會受到很多詛咒)?
我不會使用硬連結。有些編輯器在保存文件時會斷開硬連結,有些則不會,有些可以配置。但是,保存文件時保留硬連結意味著文件已寫入到位,這意味著如果系統在寫入過程中崩潰,您將得到一個不完整的文件。這就是為什麼保存到新文件並就地移動更可取的原因——但這會破壞硬連結。
特別是,大多數版本控制軟體會破壞硬連結。所以硬連結出來了。
符號連結的森林沒有這個問題。您需要確保將編輯器指向主副本或編輯器遵循符號連結。
您可以使用
cp -as
. 但是,如果您創建新文件,cp -as
則不方便創建相應的符號連結(它會完成這項工作,但會讓您沉浸在目標已經存在的抱怨中)。您可以使用簡單的 shell 循環。for env in environement1 environment2 environment3; do cd "../$env" find ../src \ -type d -exec mkdir {} + \ -o -exec sh -c 'ln -s "$@" .' _ {} + done