Linux-Mint

在環境之間共享項目樹

  • June 2, 2014

為了節省空間和時間,我在網路驅動器上複製了一個大型項目樹作為硬連結,即

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

引用自:https://unix.stackexchange.com/questions/132328