Git - 将子文件夹推送到不同的存储库

时间:2017-08-08 10:09:19

标签: git github version-control gitlab

我有一个包含许多文件和项目的大型存储库。此repo中的一个子文件夹必须是一个新的独立存储库。

我不需要在新版本中保留历史记录,但我必须能够随时使用原始仓库中的更改来更新新的仓库。

这个想法是旧的仓库是一个私有的内部gitlab,新的仓库是部署项目的公共仓库。

我该怎么做?

3 个答案:

答案 0 :(得分:1)

最自动"自动"设置它的方法可能是使用子模块。您可以在此处阅读有关子模块的信息:https://git-scm.com/book/en/v2/Git-Tools-Submodules

我对子模块的工作量不大。我可以告诉你,人们常常把这个功能搞得一团糟,所以你可能想要考虑它是否值得。但是如果你想直接git支持你在更广泛的repo的上下文中修改文件的想法,并且更具体的公共repo收到更新,那么这是我能想到的唯一方法。

因此,如果你决定使用这种方法,你会:

  • 查看父回购的相应版本
  • 初始化一个新的仓库以充当子仓库
  • 将所有内容从父回购工作树的子目录移动到子回购工作树
  • 提交子回购
  • 使用子模块引用替换父repo中的子目录

需要一些额外的设置才能将更改推送到子模块;有关所有详细信息,请参阅链接的文档页面。

如果一个较少的&#34;以git为中心的&#34;方法是可以接受的,那么你可以简单地编写从&#34;父母&#34;回购并将其应用于儿童回购。这有多难取决于您的具体要求。 (&#34;更新&#34;只是意味着您已选择加入儿童回购主人的新快照?或者在更新期间您需要复制干预历史吗?)< / p>

如果您确实需要编写历史记录转移脚本,那么您希望git filter-branch使用subdirectory-filter选项来创建新的提交,然后您就可以了获取子repo并移植(可能再次使用filter-branch)到历史树上。

答案 1 :(得分:1)

您可以将新仓库视为旧仓库的子树,并使用git subtree push的旧仓库更新新仓库。详细步骤如下:

假设旧仓库包含不同项目的文件夹project1project2project3等。而且project1已经在新的回购中进行了管理。

首先,用新的仓库替换旧仓库中的project1文件夹。

# Copy project1 folder out of old repo
# Delete the project1 folder in old repo, then use the commands in old repo
git add .
git commit -m 'delete project1 folder in old repo'
git subtree add --prefix=project1 <URL for new repo> master

旧回购中的project1文件夹是新回购中的子树。您可以在旧仓库中进行更改和提交(git commit)

当您需要使用旧仓库更新新仓库时,您可以使用:

git subtree push --prefix=project1 <URL for new repo> master

现在新的仓库将会更新。

答案 2 :(得分:0)

如果您只需要从私有存储库更新公共存储库,而永远不需要相反的方向,则可以使用:

C:\privateRepo> git subtree push --prefix=public ..\publicRepo publicBranch

这将复制所有访问子文件夹public的提交(副本将仅包含有关该子文件夹中文件的信息),并将这些提交推送到分支{{的C:\publicRepo中的存储库中1}}。