我需要将mercurial项目转换为git项目,但我想保持提交历史完整。我目前的解决方案是删除hg相关文件,然后git init &&手动添加我需要的文件,但这不会保留历史。有什么解决办法吗?
当前回答
这将是一个更好的评论,对不起,我没有评论权限。
@mar10评论是我需要这样做的缺失部分。
注意,'/path/to/old/ mercural_repo '必须是文件系统上的路径(而不是URL),因此您必须在此之前克隆原始存储库。- 13年12月27日3月10日16:30
这条评论是关于为我解决这个问题的答案https://stackoverflow.com/a/10710294/2148757,这与这里标记正确的答案https://stackoverflow.com/a/16037861/2148757相同
这将我们的hg项目移动到git,提交历史完整。
其他回答
这将是一个更好的评论,对不起,我没有评论权限。
@mar10评论是我需要这样做的缺失部分。
注意,'/path/to/old/ mercural_repo '必须是文件系统上的路径(而不是URL),因此您必须在此之前克隆原始存储库。- 13年12月27日3月10日16:30
这条评论是关于为我解决这个问题的答案https://stackoverflow.com/a/10710294/2148757,这与这里标记正确的答案https://stackoverflow.com/a/16037861/2148757相同
这将我们的hg项目移动到git,提交历史完整。
如果您想将现有的mercurial存储库导入到“GitHub”存储库中,现在只需使用这里提供的GitHub导入器[需要登录]。没有更多的混乱的快速导出等(虽然它是一个非常好的工具)
您将获得所有的提交、分支和标记。还有一件很酷的事情是,你还可以更改作者的电子邮件id。看看下面的截图:
好吧,我终于算出来了。这是在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回购推到一个非裸的。
将Mercurial转换为Git的一些经验笔记。
1. hg-fast-export
使用hg-fast-export失败,我需要-force如上所述。接下来我得到了这个错误:
错误:不能锁定ref 'refs/heads/stable': 'refs/heads/stable/sub-branch-name'存在;不能创建“refs/heads/stable”
在完成hg-fast-export后,我最终得到了一个被截断的回购。我认为这种回购有很多孤立的分支,hg-fast-export需要一种有点理想化的回购。这一切似乎有点粗糙的边缘,所以我转移到窑和谐(http://blog.fogcreek.com/announcing-kiln-harmony-the-future-of-dvcs/)
2. 窑
窑和谐似乎不存在一个免费层帐户如上所述。我可以在Git-only和mercury -only回购之间进行选择,并且没有切换的选项。我提出了支持票,如果他们回复,我会分享结果。
3. HG-git
Hg-Git mercurial插件(http://hg-git.github.io/)确实对我有用。在Mac OSX上,我通过macports安装hg-git,如下所示:
Sudo端口安装python27 Sudo端口选择——设置python python27 Sudo端口安装py27-hggit 六世~ / . hgrc
.hgrc需要这些行:
[ui]
username = Name Surname <me@mydomain.com>
[extensions]
hgext.bookmarks =
hggit =
然后我成功地做到了:
hg push git+ssh://git@bitbucket.org:myaccount/myrepo.git
4. 警告:了解你的回购
以上这些都是很钝的工具,我之所以向前推进,是因为它花了足够的时间让团队正确地使用git。
在第一次按(3)推动项目时,我最终丢失了所有新的更改。这是因为这一行代码只能被视为指南:
$ hg bookmark -r default master # make a bookmark of master for default, so a ref gets created
理论是,默认的分支可以被认为是主时,推到git,在我的情况下,我继承了一个回购,他们使用“稳定”作为等效的主。此外,我还发现回购的尖端是一个尚未与“稳定”分支合并的修补程序。
如果不能正确理解Mercurial和要转换的repo,最好不要进行转换。
我做了以下工作,以便为第二次转换尝试准备好回购:
hg update -C stable
hg merge stable/hotfix-feature
hg ci -m "Merge with stable branch"
hg push git+ssh://git@bitbucket.org:myaccount/myrepo.git
在此之后,我在git中有一个可验证的等效项目,但是我前面提到的所有孤立的分支都消失了。我不认为这太严重,但我很可能会后悔这是一个疏忽。因此,我最后的想法是无论如何都要保留原作。
编辑:如果你只想要git中的最新提交,这比上面的合并更简单:
hg book -r tip master
hg push git+ssh://git@bitbucket.org:myaccount/myrepo.git
另一种选择是创建一个免费的Kiln帐户——在git和hg之间往返,保留100%的元数据,这样您就可以使用它进行一次性转换,或者使用它访问存储库,使用任何您喜欢的客户端。
推荐文章
- 当git说它正在“解析delta”时,它实际上在做什么?
- Git命令将一个文件夹移动到另一个文件夹
- 在单个文件中重新启动/撤消冲突解决方案
- Visual Studio代码如何解决合并冲突与git?
- 无法推送到远程分支,无法解析到分支
- Git:如何将数据库重置为特定的提交?
- 如何在合并期间使用Git和命令行保存本地文件或远程文件?
- 能够用一个命令推到所有git遥控器?
- 重新基于Git合并提交
- 忽略已经签入目录的内容?
- 如何从windows cmd保存git提交消息?
- (Mac) -bash: __git_ps1:命令未找到
- 如何删除多个已删除的文件在Git仓库
- 使用vimdiff查看所有' git diff '
- 如何拉特定的目录与git