从 Accurev 到 Git (.net) 的源代码管理迁移

Source Control Migration from Accurev to Git (.net)

目前我们有一个大项目,大约 10GB(包括 dll),如果没有 dll,可能大约 5GB,在 Accurev 中,获取/升级/推广等真的很慢...

我们正在考虑迁移到 GIT,但最大的问题是它是一个巨大的单体,加上它的结构方式,我们有一个 DEPOT 用于所有项目。我们有一个 LIBRARY 文件夹,所有项目都构建到该文件夹​​,而不是 bin 文件夹,因此可以共享库引用。每个库都构建到该 LIBRARY 文件夹,所有项目间引用都引用 LIBRARY 文件夹中的 dll。

我们如何开始将项目分块并迁移到 GIT?我正在考虑首先设置一个内部 NUGET 服务器和 NUGET-ting 当前的公共库,将它们放在 GIT...现在。

有什么建议吗?

您可以使用我编写的脚本 ac2git 将您的存储库转换为 git,但这可能需要一段时间。

转换后,您可以使用 git filter-branch --subdirectory-filter 将转换后的整体 git 存储库分成每个项目 git 存储库。

应该可以,但可能会很慢。

或者,如果您愿意,可以修改我的脚本来执行您想要的操作。您只需要确保它在转换 repo 时仅在您感兴趣的目录上运行 accurev pop 命令,这将使每个项目的速度更快,但总体速度相同。

编辑:

如果您决定一次只转换一个文件夹,那么硬编码脚本来执行您想要的操作对您来说是微不足道的。您需要做的就是修改对 accurev.pop() 的所有调用(其中只有一个在 AccuRev2Git.TryPop() 函数中)并向调用添加另一个参数,指定您希望填充哪个文件夹。

def TryPop(self, streamName, transaction, overwrite=False):
    for i in xrange(0, AccuRev2Git.commandFailureRetryCount):
        # --- Remove this line --- #
        #popResult = accurev.pop(verSpec=streamName, location=self.gitRepo.path, isRecursive=True, isOverride=overwrite, timeSpec=transaction.id, elementList='.')
        # --- And add this instead --- #
        popResult = accurev.pop(verSpec=streamName, location=self.gitRepo.path, isRecursive=True, isOverride=overwrite, timeSpec=transaction.id, elementList='/./<your project folder>')
        # --- End hardcoding hack --- #
        if popResult:
            break
        else:
            self.config.logger.error("accurev pop failed:")
            for message in popResult.messages:
                if message.error is not None and message.error:
                    self.config.logger.error("  {0}".format(message.text))
                else:
                    self.config.logger.info("  {0}".format(message.text))

    return popResult