在 Windows 中通过 "fast-export" 将 Hg 迁移到 Git

migrate Hg to Git via "fast-export" in Windows

我有一个具有 Mercurial HG 代码源管理的项目,并尝试在 VSTS/Git 平台上迁移它。

我读到有一个工具可以做到这一点,“fast-export”...所以我尝试了但没有实现 Windows...

假设我有 D:\MyProject 包含 .hg 目录和项目代码文件,我

现在奇怪的事情开始发生了,命令行 window 出现又消失得如此之快我不明白发生了什么,所以我重新启动了之前的命令希望看到消息...我应该尝试数十次,直到能够在打印屏幕中捕获命令行消息,上面写着奇怪的东西:

which: no D:\fast-export-master\hg-fast-export.sh in (/c/Users/xxx/bin:mingw64/bin:/user/local/bin:/usr/bin:/bin/mingw64/bin:/usr/bin:/c/Users/xxx/bin:/c/ProgramData/Oracle/Java/javapath:/c/WINDOWS/system32 [...etc...etc...])

我想知道问题是什么以及如何解决...

编辑:

按照@max630 的建议,我重新安装了 Python 并更新了 PATH,所以它在命令

中被识别了
> python
Python 2.7.9 (default, Dec 10 2014, 12:28:03) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.

从开始菜单打开 "GIT Bash" 然后

cd "/D/MyProject-git"
../fast-export-master/hg-fast-export.sh -r "D:\MyProject" --force

给出了:

../fast-export-master/hg-fast-export.sh: line 175: python: command not found
C:\Program Files\Git\mingw64\libexec\git-core\git-fast-import.exe statistics:
---------------------------------------------------------------------
Objects allocated:       5000
...

与 git 捆绑在一起的 bash 中似乎存在错误。如果直接从 cmd 的 运行ning .sh 文件启动,它不会正确初始化“$@”。

从开始菜单打开 "GIT Bash",然后发出命令:

cd "/D/MyProject-git"

导航至 D:\MyProject-git,并且

../fast-export-master/hg-fast-export.sh -r "D:\MyProject"

到运行你的脚本

由于您已经安装了 TortoiseHg,因此有一种更简单的方法可以将 hg 迁移到 git。

首先,在 TortoiseHg 中启用 hggit:

TortoiseHg -> 全局设置 -> 扩展选项卡 -> select hggit -> 确定。

然后使用以下命令迁移并推送到 VSTS git 存储库:

# In an empty folder
mkdir git
cd git
git init
cd ..
hg clone <URL for Hg repo>
cd hgrepo
hg bookmarks ../git
cd ..
cd git
git checkout hg
git remote add origin <VSTS git repo URL>
git push origin --all

我认为您担心的是您将 "hg-fast-export" 导入到一个未添加到环境变量的目录中,根据错误消息 "D:\fast-export-master\hg-fast-export.sh" was not found in the list of your environment变量,因此请尝试在您的环境变量中添加以下 "D:\fast-export-master\",然后重试。

如果还没有解决,请查看这篇文章并按照所说的逐步进行:

https://www.appveyor.com/blog/2014/02/23/converting-mercurial-repository-to-git-on-windows/

作者已将目录"hg-fast-export"复制到新目录git中(没有"hg-fast-export"的.git)并且还添加了hg,git 和 python 到他的环境变量。

祝你好运

Following the @max630 suggestion bellow, I reinstalled Python and update the PATH

从 Git 2.24(2019 年第 4 季度)开始,您将必须安装 Python 3,因为 hg-to-git 脚本(在 contrib/ 中)已更新为与 Python 一起工作 3.

commit d17ae00 (18 Sep 2019) by Hervé Beraud (4383)
(由 Junio C Hamano -- gitster -- in commit 8f53fe1 合并,2019 年 10 月 7 日)

hg-to-git: make it compatible with both python3 and python2

Python 2 is EOL at the end of 2019, many distros and systems now come with python 3 as their default version.

Rewrite features used in hg-to-git that are no longer supported in Python 3, in such a way that an updated code can still be usable with Python 2:

  • print is not a statement; use print() function instead.
  • dict.has_key(key) is no more; use "key in dict" instead.

为了帮助任何人,我花了一段时间才让 hg-fast-export 开始工作,但我最终做到了。以下是我 运行 关注的一些问题:

  • 我需要安装 Python 并且还必须将 Python 二进制目录添加到系统路径中。
  • 说明说 运行 hg-fast-export 来自 git bash window。在我第一次尝试时,我什至无法 cd 到正确的目录,因为我的 bash shell 让我 "jailed" 到我的主目录层次结构。我以管理员身份将 git bash 快捷方式更改为 运行,删除了 --cd-to-home 参数,并将其设置为从 C: 开始。请注意,一旦启动 shell,路径将以 /c/.
  • 开头
  • 在发出命令 git init 来创建一个空的 repo 之后,我还必须发出 git config core.ignoreCase false 之前导出会走得更远。
    • 接下来我得到错误 "ImportError: No module named mercurial"。我已经完成了 TortoiseHg 的二进制安装,但它需要源代码。我下载了Mercurial源码,并将源码根目录添加到系统环境变量PYTHONPATH中。然后我重新启动gitbash.
    • 现在 git-快速导出成功了!
    • 如文档所述,git status 会将所有文件显示为 "deleted"。发出命令 git checkout HEAD,重复 git status,它应该显示 "nothing to commit, working tree clean".

我花了很多时间尝试上述许多解决方案,但没有一个适合我。我在 tortoisehg 中尝试了 fast-export 和 hggit 的多种变体。

最后我使用 GitHub Importer 将我所有的 mercurial 存储库导入 GitHub。

我只需要提供存储库的 URL(我的在 BitBucket 中),这是一个非常顺利和简单的过程。比尝试让 python 在 git bash、路径变量等中工作要顺利得多!

我还有一些重大的本地更改无法推送到 bitbucket,因为它们不允许推送。所以我不得不手动将这些文件复制到 git 存储库中。

当从 VCS roots 从 bitbucket 切换到 github 时,我也无法让 teamcity 检测到变化。所以我在team city新建了一个项目。

我希望这对面临这些挑战的任何人有所帮助。