为仅推拉子文件夹设置单独的遥控器



假设我有两个repo,repo Arepo B,其中包含一个文件夹,其代码与repo A中的代码相似(这实际上是如何发生的并不重要,但好吧,假设我刚刚从A复制了内容)。

现在我想要以下内容:

  • 像我在回购A中习惯的那样工作
  • 设置和附加指向repo B的远程repo,但仅推拉此子文件夹
  • 要推,什么时候需要这个回购B

所以,基本上,我正在寻找最便宜的方式来进行反向稀疏结账。

这似乎正是git-subtree1试图解决的问题。

cd repoB
git subtree pull -P folder {repoA URL} {repoA branch}
... edit test commit... 
git subtree push -P folder {repoA URL} {repoA branch}

您可以为添加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

一种方法是建立包含两个项目通用代码的第三个存储库,然后将该存储库用作存储库A和B中的子模块。

然而,如果我理解你的问题,整个A存储库就是那个"通用"代码。在这种情况下,不需要在第三个存储库中,您可以简单地将A添加为B中的子模块。

克隆repoA以创建新的repoB。然后,为除子文件夹之外的所有内容设置假定不变的位:

git update-index --assume-unchanged *
git update-index --no-assume-unchanged <subdirectory>

注意:文件/目录参数不得以./开头

之后,您可以删除除子文件夹之外的所有内容。由于假设位不变,git不会注意到这一点。现在按原样工作,这将是一个正常的存储库。您可以将更改后的文件从旧报告复制到此报告。

请注意,推拉可能会再次创建不在子文件夹中的文件。为了防止这种情况,您可以创建一个钩子来删除除子目录之外的所有内容。

最新更新