从 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
目前我们有一个大项目,大约 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