我有以下設定:
mkdir /base; cd /base
git init a
touch a/file.txt
git init b
cd b
git config core.worktree=/base
git add ../a/file.txt
我有一個/base檔案夾,其中包含兩個存盤庫(a和b)。Repoa只包含一個檔案(甚至沒有提交)。回購b將作業樹設定為/base(兩個回購所在的位置)。當我嘗試添加file.txtfrom repo 時a,它不起作用(它只是沒有上演)。
當我.git從 中洗掉檔案夾時a,我可以添加檔案。
rm -rf ../a/.git
git add -vvv ../a/file.txt
我不確定為什么會這樣。也許 git 阻止添加檔案,因為它認為它是一個子模塊?我試圖通過一些子模塊設定來防止這種情況發生,但沒有效果。
git config submodule.ignore all
git config submodule.active false
如何欺騙 git 強行添加檔案?(-f僅用于被忽略的檔案,不-v提供任何資訊)。
編輯:我通過.git使用以下腳本臨時重命名檔案夾來管理它:
# Check if there is a .git folder. If so, we need to temporary
# rename it, so we can track the file/folder.
GIT_DIR=
TRAVERSAL_PATH="$RESOURCE_TO_TRACK"
while [[ "$TRAVERSAL_PATH" != "/" ]]; do
if [[ -d "$TRAVERSAL_PATH/.git" ]]; then
GIT_DIR="$TRAVERSAL_PATH/.git"
break
fi
TRAVERSAL_PATH="$(dirname $TRAVERSAL_PATH)"
done
[[ "$GIT_DIR" != "" ]] && mv "$GIT_DIR" "$GIT_DIR.keep"
git add -v -f "$RESOURCE_TO_TRACK"
[[ "$GIT_DIR" != "" ]] && mv "$GIT_DIR.keep" "$GIT_DIR"
$RESOURCE_TO_TRACK是我要添加到存盤庫的檔案夾檔案。初始添加后,我的回購跟蹤更改并按預期進一步添加/提交作業。
uj5u.com熱心網友回復:
你不能。
更準確地說,某個提交中檔案的路徑名必須僅包含“降序”組件,所有這些組件都位于該存盤庫中,而不是檔案系統上的任何其他存盤庫中。所以,如果一個檔案的路徑名../dir/file,你可以不加它,并且如果一個檔案的名稱是dir/sub/file其中dir/sub包含了.git,你不能添加它。
最后一個限制是子模塊限制:
也許 git 阻止添加檔案,因為它認為它是一個子模塊?
它是一個子模塊,如果它在另一個帶有 a 的目錄.git中。
您可以使用 繞過子模塊限制git update-index,但如果這樣做,您將陷入危險境地:
$ git hash-object -w dir/sub/foo
e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
$ git update-index --add --cacheinfo 100644,e69de29bb2d1d6434b8b29ae775ad8c2e48c5391,dir/sub/foo
如果dir/sub真的是一個 Git 存盤庫,此時會發生什么還沒有明確定義。(我創建了一對臨時存盤庫來運行這些命令,這里沒有進一步檢查。)請注意,../它作為路徑組件無效:
$ git update-index --add --cacheinfo 100644,e69de29bb2d1d6434b8b29ae775ad8c2e48c5391,../sub/foo
error: Invalid path '../sub/foo'
fatal: git update-index: --cacheinfo cannot add ../sub/foo
uj5u.com熱心網友回復:
請閱讀底部的重要說明以獲得更好的替代解決方案!
所問問題的字面答案
盡管您不能,正如 torek 很好地解釋的那樣,但有一個解決方法。
您可以版本化您的檔案b并a使用腳本將其復制。這是您的設定:
/base
|- a
| |- .gitignore
|- b
|- copy-file
|- resources
|- file.txt
/base/b/resources/file.txt是您的檔案應該屬于/base/a但版本為/base/b./base/b/copy-file是將檔案復制到正確位置的腳本,不要忘記使其可執行。/base/a/.gitignore忽略file.txt以便復制的檔案不在/base/a.
您的作業流程如下:
- 更新所有分支。
- 運行
/base/b/copy-file(可能使用 git hooks),這將file.txt在/base/a. - 開始作業。
重要的提示
我知道這樣做似乎很誘人,因為將您推入當前作業流程的原因,但即使我按原樣回答了您的問題,我也建議您研究不同的方法。例如:
- 將
copy-file腳本保留在/base. 您沒有使用這兩個子檔案夾完成單個專案可能是有原因的。這個原因必須是可重用性。如果您a在b存盤庫中定義子目錄的相對路徑,則意味著它們以某種方式連接且相互依賴。這讓我想到了下一個更好的解決方案: - 使用包管理器!我敢肯定,您的語言擁有那些精美的包管理器之一,它們無處不在!所以使用
npm,pip,composer或任何語言的作品用,讓你的b子專案需要您的a子專案(或其他方式,這不是真的不清楚什么需要你的問題是什么)和使用命名空間來參考遙遠的檔案,當你在其他子專案中需要它。你通常不需要發布你的子專案之一來使用官方包管理器網站,你應該有一種方法來包含一個 Git 存盤庫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/372638.html
標籤:混帐
上一篇:無法將我的主分支更改為本地主分支
