假设我有两个 repos,repo A和repo B,其中包含一个文件夹,其中的代码类似于 repo A 中的代码(实际上这并不重要,但是好的,假设我刚刚从一个)。
现在我想要以下内容:
- 像我在回购 A 中习惯的那样工作
- 设置和附加远程 repo 指向 repo B,但只推拉这个子文件夹。
- 推送,当它需要这个 repo B.
所以,基本上,我正在寻找最便宜的方式来进行反向稀疏检查。
假设我有两个 repos,repo A和repo B,其中包含一个文件夹,其中的代码类似于 repo A 中的代码(实际上这并不重要,但是好的,假设我刚刚从一个)。
现在我想要以下内容:
所以,基本上,我正在寻找最便宜的方式来进行反向稀疏检查。
这似乎正是 git-subtree 1试图解决的问题。
cd repoB
git subtree pull -P folder {repoA URL} {repoA branch}
... edit test commit...
git subtree push -P folder {repoA URL} {repoA branch}
一种方法是设置包含两个项目通用代码的第三个存储库,然后将该存储库用作存储库 A 和 B 中的子模块。
但是,如果我正确理解您的问题,那么整个 A 存储库就是那个“通用”代码。在这种情况下,第三个存储库中不需要,您可以简单地将 A 添加为 B 中的子模块。
您可以添加 ref 并在 repo 中发布任何内容。因此,要维护一个单独的分支来跟踪主分支的子文件夹,请将其添加到您的提交仪式中:
# in your commit ritual (no need to be mainbranch-specific,
# this will detect changes and add the tracking commits only as necessary),
if [ `git rev-parse mainbranch:path/to/subfolder` \
!= `git rev-parse subfolderbranch:path/to/subfolder` ]; then
git commit-tree -p subfolderbranch -p mainbranch \
mainbranch:path/to/subfolder <<<"tracking mainbranch subfolder" \
| xargs git update-ref -m"tracking mainbranch subfolder" refs/heads/subfolderbranch
fi
克隆 repoA 以创建新的 repoB。然后,为除子文件夹之外的所有内容设置假设不变位:
git update-index --assume-unchanged *
git update-index --no-assume-unchanged <subdirectory>
注意:文件/目录参数不能以 a.
或 a开头/
之后,您可以删除除子文件夹之外的所有内容。由于假设不变的位 git 不会注意到这一点。现在工作,这将是一个正常的存储库。您可以将更改的文件从旧的 repoB 复制到这个。
请注意,推送和拉取可能会再次创建不在子文件夹中的文件。为了防止这种情况,您可以创建一个挂钩来删除除子目录之外的所有内容。