tfs迁移代码到git
您是否正在使用TFS,并想切换到像Git这样的分布式VCS? 那么,本文可能会有所帮助。 我Swift写下了将现有TFS存储库导出到Git所需的步骤和一些提示。
实际上,几年前,当我们在工作中切换到Git(与Gitlab一起使用)时,我实际上写了本文的注释。 尽管如此,我仍然时不时地将驻留在TFS上的旧项目迁移到Git上,并且鉴于Microsoft最近也在内部(至少对于他们的OSS项目)也迁移到了Git,所以本文可能是相关的:)。
我不想概述的是为什么我们进行切换的细节。 它与GitLab提供的更现代的基于Web的界面有关,该社区基本上与Git一起生活在GitHub上,并且可以进行简单,快速(和本地)分支和合并。
您可能感兴趣的其他与Git相关的帖子:
因此,在迁移时,您可以简单地复制文件并创建一个全新的Git存储库(使用git init
)。 但这通常是您不想执行的操作。 特别是在大型项目中,您肯定要保留存储库历史记录。 因此,您需要正确导出TFS存储库。 这就是gittf发挥作用的地方。
Gittf项目
gittf是Codeplex上的一个项目,似乎由Microsoft本身(至少由Microsoft员工)驱动。
Git-TF是一组跨平台的命令行工具,可促进Microsoft Team Foundation Server,Visual Studio Online和Git之间的更改共享。 […]这些工具使从TFS克隆源,从TFS获取更新以及使用在Git中本地提交的更改更新TFS变得容易。
尽管人们认为可以在基于TFS的中央存储库中使用git,但我从未以这种方式使用过。 尝试了几次,但是这种“混合”情况的想法对我来说太可怕了。 该工具有用的地方是针对我们从TFS迁移到git的用例。
您可以按照gittf codeplex页面上的说明进行安装 ,也可以直接下载最新版本,解压缩所有内容并直接从该目录中执行命令。 只要确保您的系统满足最低要求,例如安装Java等即可。
出口
第一步是找到您的TFS服务器的url和项目的相应位置。 那应该不太困难。 只需在Visual Studio源代码管理资源管理器插件中查找即可。
注意:我从Git Bash测试了所有这些命令,这是Windows上的首选命令行,尤其是与Git交互时。
获得URL后,打开一个控制台,在其中可以访问git-tf并执行以下命令(显然是在调整位置):
$ git tf clone http://yourtfsserver:8080/tfs/colletionname $/TeamProjectA/Main --deep
您也可以在Codeplex文档上找到此命令。 注意,请记住包括–deep来提取整个版本历史记录。 否则,将仅获取最新的变更集,而在完全导出的情况下,您将不需要这些变更集。
打扫干净
git-tf为每个TFS变更集创建一个git标签。 这对于从Git内部跳转到特定的TFS提交可能很有用。 导出仓库时,通常不需要它们。 因此,要删除所有它们在本地git存储库中,请执行
$ git tag -l | xargs git tag -d
如果您不小心将它们推送到了远程Git存储库,那么此命令可能会有所帮助
$ git ls-remote --tags origin | awk '/^(.*)(\s+)(.*[0-9])$/ {print ":" $2}' | xargs git push origin
如果您已经碰巧有其他标签,则可以调整前面显示的命令以仅捕获TFS标签:
$ git ls-remote --tags origin | awk '/^(.*)(\s+)(.*TFS.*[0-9])$/ {print ":" $2}' | xargs git push origin
调整提交者名称
您可能会遇到的另一种情况是, 提交者名称在TFS上而不是在Git上不同 。 Git通常通过其配置的电子邮件地址来识别提交者,而TFS通常使用您的Windows身份。 结果,在Git存储库中,同一个人可能由两个不同的“提交者”代表。 通过TFS用户名(由于导入)和真正的git用户(用于在Git存储库上进行的新提交)。 当然...是关于化妆品的,但仍然...
幸运的是,在Google上进行的快速搜索将我带到了这个Stackoverflow帖子中 ,其中显示了filter-branch
命令。
在Git bash中,使用以下命令:
git filter-branch -f --commit-filter '
if [ "$GIT_COMMITTER_NAME" = "<old TFS user>" ];
then
GIT_COMMITTER_NAME="<new name>";
GIT_AUTHOR_NAME="<new name>";
GIT_COMMITTER_EMAIL="<new - email>";
GIT_AUTHOR_EMAIL="<new - email>";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD
在Windows命令提示符下,使用以下命令:
git filter-branch -f --commit-filter "
if [ "$GIT_COMMITTER_NAME" = "<old TFS user>" ];
then
GIT_COMMITTER_NAME="<new name>";
GIT_AUTHOR_NAME="<new name>";
GIT_COMMITTER_EMAIL="<new - email>";
GIT_AUTHOR_EMAIL="<new - email>";
git commit-tree "$@";
else
git commit-tree "$@";
fi" HEAD
结论
就是这样,使用这些命令,迁移非常容易。 导出和调整提交者名称可能只花费一些时间。 显然,这取决于导出的存储库的大小。
来自Microsoft的Alex Rukhlin的荣誉,在调试和解决gittf导出过程中遇到的一些讨厌的异常(和错误)方面提供了很大的帮助。 谢啦!
翻译自: https://www.javacodegeeks.com/2015/03/migrate-from-tfs-to-git.html
tfs迁移代码到git