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

10
我有一个包含许多文件和项目的大型代码库。其中一个子文件夹需要成为一个独立的新仓库。
我不需要在新仓库中保留历史记录,但是我必须能够随时从原始代码库中将更改更新到新仓库中。
这个想法是旧的代码库是私人的内部GitLab,而新的代码库是用于部署项目的公共代码库。
如何实现这一点?

你解决问题了吗? - Marina Liu
很难说。Mark 提供的解决方案可能可以,但相当复杂。我会与其他决策者讨论,看看我们是采用 Git 还是类似于 scp 的文件同步。 - zupazt3
好的,我添加了另一种使用子树的方法,你可以试试看。 - Marina Liu
3个回答

6
您可以将新的存储库视为旧的存储库的子树,并使用 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

现在新的代码库将会更新。


最终,我通过在一个单独的文件夹中简单地进行新存储库的git克隆,然后复制所有项目文件并在新存储库中进行常规提交和推送来解决了这个问题。但我认为你的帖子非常好地回答了我的初始问题,所以我接受它。 - zupazt3
最新的命令应该是 git subtree push --prefix=project1 <新仓库的URL> master - Sig

3

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

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

这将复制所有访问子文件夹public的提交(复制将只包含在该子文件夹中的文件信息),并将这些提交推送到位于分支publicBranchC:\publicRepo 存储库中。


将特定文件夹推送到另一个存储库的完美解决方案。 - kamran

1
最“自动化”的设置方法可能是使用子模块。您可以在这里阅读有关子模块的信息:https://git-scm.com/book/en/v2/Git-Tools-Submodules 我不太多地使用子模块。我可以告诉您,人们经常对该功能进行贬低,因此您可能需要考虑它是否值得。但是,如果您想要直接使用 git 支持的想法,即在更广泛的存储库上下文中修改文件,并且更具体的公共存储库接收更新,则这是我能想到的唯一方法。
因此,如果您决定使用此方法,则应:
- 检出父存储库的适当版本 - 初始化一个新存储库以作为子存储库 - 将父存储库工作树的子目录中的所有内容移动到子存储库工作树中 - 提交子存储库 - 在父存储库中用子模块引用替换子目录
需要进行一些额外的设置才能将更改推送到子模块;有关所有详细信息,请参阅链接的文档页面。
如果可以接受不那么“以git为中心”的方法,那么您可以简单地脚本化从“父”存储库获取更新并将其应用于子存储库的过程。这会根据您的具体要求而定,难度如何取决于“更新”是否只是您选择附加到子存储库主分支的新快照,或者在更新期间您是否需要复制中间历史记录。如果您在任何时候需要脚本化传输历史记录,则需要使用git filter-branch及其subdirectory-filter选项创建新提交,然后将其提取到子存储库中,并将其移植(可能再次使用filter-branch)到历史树上。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接