簡體   English   中英

確保相對 Git 路徑

[英]Ensuring relative Git paths

我已將 Git 存儲庫(包含多個子模塊)移動到本地磁盤上的另一個目錄。 任何 git 命令都會產生錯誤:

fatal: Not a git repository: <absolute path to .git/modules/*>

該錯誤源自在不同位置編碼的文件的絕對路徑[1]。 兩個問題:

  • 是否有用於修復這些路徑的 Git 命令,即,使它們相對?[2]
  • 有沒有辦法確保未來的 Git 存儲庫只使用相對路徑?[3]

謝謝!


筆記

  1. 我注意到對於所有子模塊, .git文件包含:

     gitdir: <absolute path to repository>

    每個子模塊 ( .git/modules/*/config ) 中的core.worktree參數設置為該子模塊的絕對路徑。

  2. 我不是在尋找 shell 命令,而是在尋找本機 Git 方法。

  3. 我不確定絕對路徑是否是使用舊版本的 Git 創建的,而新版本則采用了相對路徑。

我寫了一個 oneliner(需要 bash 和 coreutils),它將任何 .git gitdir 文件更改為相對路徑:

find -type f -name .git -exec bash -c 'f="{}"; cd $(dirname $f); echo "gitdir: $(realpath --relative-to=. $(cut -d" " -f2 .git))" > .git' \;

如果你不喜歡在這里找到一個帶有 git 子模塊的:

git submodule foreach --recursive '[[ -f .git ]] && echo "gitdir: $(realpath --relative-to=. $(cut -d" " -f2 .git))" > .git'

適用於 Windows 的@r3dey3 解決方案:

git submodule foreach --recursive '[[ -f .git ]] && chmod +w .git && echo "gitdir: $(realpath --relative-to=. "$(cygpath -u "$(cut -d" " -f2 .git)")")" > .git'

在這里我補充說:

  • chmod +w .git刪除只讀屬性
  • cygpath -u調用將 Windows 路徑轉換為 ​​Unix 路徑

我遇到了同樣的問題。

這是我編寫的一個小腳本的要點,可能會有所幫助。

通過將路徑轉換為相對形式並沒有真正解決問題,但它確實在相關位置進行了快速搜索和替換,讓您可以修復所有問題。 如果您正在處理一組復雜的子模塊,其中可能有很多路徑需要修復,則特別方便。

請注意,我自己在 OS X 10.8 上使用過這個腳本,但我不能 100% 確定它在所有情況下都有效,所以要小心並采取明智的預防措施!

https://gist.github.com/3394771

以下命令將所有子模塊的路徑轉換為相對路徑(即使子模塊.git文件中的gitdir值錯誤或為空,它也能工作,因此即使將存儲庫移動到新位置后也可以使用該命令):

for module in $(dirname $(find .git/modules -type f -name description)); do
    git="$(echo $module | cut -d/ -f2- | perl -pe "s|modules/||g")/.git"
    if [[ -e $git ]]; then
        echo "gitdir: $(realpath --relative-to=$(dirname $git) $module)" > $git
    fi
done

它需要從存儲庫根目錄(.git 目錄所在的位置)執行。

我使用 PyTorch 存儲庫對其進行了測試,該存儲庫不僅具有子模塊,甚至還有子模塊的子模塊,並且它按預期工作。 為了確保它在不寫入文件的情況下檢測到正確的路徑,您可以通過將>替換為 來執行“試運行” . (或其他一些沒有特殊含義的符號)。 如果一切正常,則使用>實際寫入更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM