我需要将mercurial项目转换为git项目,但我想保持提交历史完整。我目前的解决方案是删除hg相关文件,然后git init &&手动添加我需要的文件,但这不会保留历史。有什么解决办法吗?
当前回答
另一种选择是创建一个免费的Kiln帐户——在git和hg之间往返,保留100%的元数据,这样您就可以使用它进行一次性转换,或者使用它访问存储库,使用任何您喜欢的客户端。
其他回答
好吧,我终于算出来了。这是在Windows上使用TortoiseHg。如果你不使用它,你可以在命令行上做。
安装TortoiseHg 右键单击资源管理器中的空白区域,然后进入TortoiseHg设置:
启用hggit:
打开命令行,输入一个空目录。 git init——bare .git(如果你不使用bare repo,你会得到一个类似abort: git remote error: refs/heads/master failed to update的错误 cd到您的Mercurial存储库。 Hg书签Hg Hg push c:/path/to/your/git/repo 在Git目录下:Git config——bool core。)别问我为什么。关于“工作树”。Git非常不友好。我发誓写实际代码要比使用Git简单。)
希望它会工作,然后你可以从新的git回购推到一个非裸的。
另一种选择是创建一个免费的Kiln帐户——在git和hg之间往返,保留100%的元数据,这样您就可以使用它进行一次性转换,或者使用它访问存储库,使用任何您喜欢的客户端。
如果您想将现有的mercurial存储库导入到“GitHub”存储库中,现在只需使用这里提供的GitHub导入器[需要登录]。没有更多的混乱的快速导出等(虽然它是一个非常好的工具)
您将获得所有的提交、分支和标记。还有一件很酷的事情是,你还可以更改作者的电子邮件id。看看下面的截图:
来自:
http://hivelogic.com/articles/converting-from-mercurial-to-git
迁移 这是一个相对简单的过程。首先下载快速导出(最好的方法是通过它的Git存储库,我将直接克隆到桌面),然后创建一个新的Git存储库,执行迁移,并签出HEAD。在命令行中,它是这样的:
cd ~/Desktop
git clone git://repo.or.cz/fast-export.git
git init git_repo
cd git_repo
~/Desktop/fast-export/hg-fast-export.sh -r /path/to/old/mercurial_repo
git checkout HEAD
在运行fast-export后迁移项目时,您应该看到一个长长的提交列表。如果您看到错误,它们可能与不正确指定的Python路径有关(请参阅上面的说明并为您的系统自定义)。 就这样,你完成了。
我有一个类似的任务要做,但它包含了其他答案没有充分涵盖的一些方面:
我想转换所有(在我的情况下:两个,或一般情况下:不止一个)我的回购分支。 在我的提交消息和文件名中,我有非ascii和(作为Windows用户)非utf8编码的字符(好奇的是:德语变音)。
我没有尝试fast-export和hg-fast-export,因为它们要求您的机器上有Python和一些Mercurial Python模块,而我没有。
我确实用TortoiseHG尝试了hg-init,这个答案给了我一个良好的开端。但是它看起来像是只转换当前分支,而不是一次全部转换(*)。所以我读了hg-init的文档和这篇博文,然后补充说
[git]
branch_bookmark_suffix=_bookmark
到我的mercury .ini,并且做了
hg bookmarks -r default master
hg bookmarks -r my_branch my_branch_bookmark
hg gexport
(对于你想要转换的每个分支重复第二行,如果你碰巧在执行第三行之前做了另一次提交,再重复一次)。这将在.hg中创建一个文件夹git,这是一个包含所有导出分支的裸git repo。我可以克隆这个回购,并有一个所需的工作副本。
或几乎…
运行
git status
在我的工作副本中显示所有名称中含有非ascii字符的文件为未跟踪文件。所以我继续研究并遵循了这个建议:
git rm -rf --cached \*
git add --all
git commit
最后,回购已经准备好被推到Bitbucket:-)
I also tried the Github importer as mentioned in this answer. I used Bitbucket as the source system, and Github did quite a good job, i.e. it converted all branches automatically. However, it showed '?'-characters for all non-ASCII characters in my commit messages (Web-UI and locally) and filenames (Web-UI only), and while I could fix the filenames as described above, I had no idea what to do with the commit messages, and so I'd prefer the hg-init approach. Without the encoding issue the Github importer would have been a perfect and fast solution (as long as you have a paid Github account or can tolerate that your repo is public for as long as it takes to pull it from Github to your local machine).
(*)所以在我发现我必须收藏我想要导出的所有分支之前,它看起来是这样的。如果您这样做并推到一个bare(!)回购,就像链接的答案所说的那样,您将获得所有的分支。
推荐文章
- 如何获得我的代码的最新版本?
- 如何在git中找到原始/master的位置,以及如何更改它?
- Bower: ENOGIT Git未安装或不在PATH中
- Bitbucket上的Git:总是要求密码,即使上传了我的公共SSH密钥
- Git别名-多个命令和参数
- 如何添加一个“打开git-bash这里…”上下文菜单到windows资源管理器?
- Mercurial初学者:最终实用指南
- 是否可以在Git中只提取一个文件?
- 当我做“git diff”的时候,我怎么能得到一个并排的diff ?
- 在git中如何将提交移动到暂存区?
- 如何缩小。git文件夹
- 如何在本地删除分支?
- 找到包含特定提交的合并提交
- Windows上Git文件的权限
- 如何从一个枝头摘到另一个枝头