[英]Ensuring relative Git paths
我已將 Git 存儲庫(包含多個子模塊)移動到本地磁盤上的另一個目錄。 任何 git 命令都會產生錯誤:
fatal: Not a git repository: <absolute path to .git/modules/*>
該錯誤源自在不同位置編碼的文件的絕對路徑[1]。 兩個問題:
謝謝!
我注意到對於所有子模塊, .git
文件包含:
gitdir: <absolute path to repository>
每個子模塊 ( .git/modules/*/config
) 中的core.worktree
參數設置為該子模塊的絕對路徑。
我不是在尋找 shell 命令,而是在尋找本機 Git 方法。
我不確定絕對路徑是否是使用舊版本的 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% 確定它在所有情況下都有效,所以要小心並采取明智的預防措施!
以下命令將所有子模塊的路徑轉換為相對路徑(即使子模塊.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.