gpt4 book ai didi

svn - 当主干移动时,如何在 Git 中保留 SVN 历史记录?

转载 作者:行者123 更新时间:2023-12-02 23:33:34 25 4
gpt4 key购买 nike

我正在尝试使用svn2git将 SVN 项目迁移到 git。然而,我在保存所有历史记录方面遇到了问题。原因似乎是因为过去行李箱被移动过。我使用的命令是:

$ svn2git http://mysvnserver.com/myproject/iPhone/ --no-minimize-url --authors ../authors.txt

但这只给我提供了可以追溯到 2011 年的历史。该项目实际上是在 2010 年开始的。预计的开始是这样的:

myproject
trunk
branches
tags

但在 2011 年改为:

myproject
iPhone
trunk
branches
tags
Android
trunk
branches
tags

旧的主干和分支位于 iPhone 目录下。我的历史是从这一举动完成时开始的。如果我这样做svn log在iPhone目录中我得到了缩短的历史记录。但如果我 cd trunk; svn log然后我就得到了完整的历史记录。

我不知道如何获取这段历史。我的想法是以某种方式创建一个 git 存储库,其中仅包含可追溯到 2010 年的主干历史记录。然后我稍后会将其作为主存储库中的分支拉入,并进行 rebase 以使历史记录正确。但我没有运气只为主干创建这个存储库。我尝试过:

$ svn2git http://mysvnserver.com/myproject/ --rootistrunk --authors ../authors.txt

$ svn2git http://mysvnserver.com/myproject/ --rootistrunk -no-minimize-url --authors ../authors.txt

没有任何成功。

最佳答案

我自己也遇到了同样的问题。这是我解决这个问题的方法。

分别克隆两个存储库。

git svn clone -s [original-svn-location] [original-clone-directory]
git svn clone -s [new-svn-location] [new-clone-directory]

将旧的克隆数据添加到新的存储库中。

cd [new-clone-directory]
git remote add oldstuff ../[original-clone-directory]
git fetch oldstuff

现在是棘手的部分......做 git logmasteroldstuff/master (或者可能是trunkolstuff/trunk——无论你如何设置)并记下新克隆的第一个提交sha和旧克隆的最后一个提交sha(就在移动之前)。

git replace [first-commit-sha-from-new-clone] [last-commit-sha-from-old-clone]

并重写 SHA 哈希值,使一切都干净,您不再需要替换引用...

git filter-branch

现在清理不再需要的引用。

git remote rm oldstuff
rm -rf .git/refs/replace

您将丢失历史记录中的第一次提交,但由于那应该是初始移动(即:实际文件内容没有更改),因此对您来说可能并不重要。

现在所有历史记录仍应保留并且 git blame报告会记住存储库的旧历史,再次为您提供准确的信息。

您应该能够根据需要经常重复此操作(取决于您的项目更改其根位置的次数和/或移动两侧都有提交的分支数量)。

PS - 这个解决方案是我根据我发现的 here 改编的,以满足我的需求。 (我无法让他的移植方法适用于我的存储库 - 但使用替换似乎效果很好)。

关于svn - 当主干移动时,如何在 Git 中保留 SVN 历史记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12938189/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com