我有一个包含许多文件和项目的大型存储库。此repo中的一个子文件夹必须是一个新的独立存储库。
我不需要在新版本中保留历史记录,但我必须能够随时使用原始仓库中的更改来更新新的仓库。
这个想法是旧的仓库是一个私有的内部gitlab,新的仓库是部署项目的公共仓库。
我该怎么做?
答案 0 :(得分:1)
最自动"自动"设置它的方法可能是使用子模块。您可以在此处阅读有关子模块的信息:https://git-scm.com/book/en/v2/Git-Tools-Submodules
我对子模块的工作量不大。我可以告诉你,人们常常把这个功能搞得一团糟,所以你可能想要考虑它是否值得。但是如果你想直接git支持你在更广泛的repo的上下文中修改文件的想法,并且更具体的公共repo收到更新,那么这是我能想到的唯一方法。
因此,如果你决定使用这种方法,你会:
需要一些额外的设置才能将更改推送到子模块;有关所有详细信息,请参阅链接的文档页面。
如果一个较少的&#34;以git为中心的&#34;方法是可以接受的,那么你可以简单地编写从&#34;父母&#34;回购并将其应用于儿童回购。这有多难取决于您的具体要求。 (&#34;更新&#34;只是意味着您已选择加入儿童回购主人的新快照?或者在更新期间您需要复制干预历史吗?)< / p>
如果您确实需要编写历史记录转移脚本,那么您希望git filter-branch
使用subdirectory-filter
选项来创建新的提交,然后您就可以了获取子repo并移植(可能再次使用filter-branch
)到历史树上。
答案 1 :(得分:1)
您可以将新仓库视为旧仓库的子树,并使用git subtree push
的旧仓库更新新仓库。详细步骤如下:
假设旧仓库包含不同项目的文件夹project1
,project2
,project3
等。而且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}}。