有人能帮我吗。我想将一些Git存储库从一台服务器移动到另一台服务器,并同时重命名它们。我遇到的问题是,当一些存储库是其他存储库的子模块时。我想在顶级模块内所有分支的历史记录中替换子模块的URL,这样一旦原始分支被删除,我仍然可以返回并重建旧的提交。我在Windows PC上,目前正在使用.bat文件来运行存储库迁移。
要将子模块从server1移动到server2,并将名称从sub_old更改为sub_new,我将原始(裸(克隆到C:驱动器上的一个文件夹中,更改URL,然后向上推到新服务器:
git clone --bare https://server1/sub_old.git c:temp_repo
cd c:temp_repo
git remote set-url origin https://server2/sub_new.git
git push --mirror
然后从服务器1中删除sub_old。
现在,当我想将使用sub_old repo作为子模块的顶级repo移动到新服务器时:
git clone --bare https://server1/top_old.git c:temp_repo
cd c:temp_repo
git remote set-url origin https://server2/top_new.git
REM At this point I want to change all of the references to the submodule from https://server1/sub_old.git to https://server2/sub_new.git
git push --mirror
然后从服务器1中删除top_old。
在我想更改子模块的所有URL引用的时候,我已经尝试使用:
git config --global url.https://server2/sub_new.git.insteadOf https://server1/sub_old.git
但没有成功。我显然不明白这应该如何工作,也不明白使用它是否合适。
我想在所有分支的历史中替换子模块的URL。。。
这需要使用git filter-branch
或git filter-repo
。从技术上讲,更改任何提交都是不可能的,所以这些命令不会这么做。相反,他们将现有存储库的提交复制到一组全新的提交,其中包含备用历史1
如果你选择这样做,请非常确定你想,因为没有回头路了。考虑使用新颖的git filter-repo
,它在这方面做得更好2请记住,一旦完成,任何人都不应该再使用旧存储库或其任何克隆。把那些克隆人赶出去。相反,制作新存储库的新克隆。
git config
而不是您正在使用的技巧有时是更好的方法。此不会在整个历史中替换子模块的URL!相反,这会使所有原始提交保持原样。这只是意味着,对于您(仅限您的帐户,因为您使用了git config --global
:没有其他用户受此影响(,每当您的Git要访问原始URL时,它就会切换到替换URL。
为了对任何其他用户有效,这些其他用户必须执行相同的git config
步骤。如果这是一个问题,你需要";用新的存储库(代表替代历史的全新提交(替换存储库(所有提交,它们是历史(";方法
1如果重写的";"替代历史";从一个未重写的提交开始,备用历史只是几乎是全新的,而不是全新的。从某种意义上说,这更糟糕,因为它更容易意外地重新介绍原始历史。然后你有两段历史,很难判断哪一段是"历史";真";一
2它似乎没有目标";固定子模块URL";选择,但这将是一个合理的要求。在内部,这相当于过滤名为.gitmodules
的文件,因此它应该很容易实现。