6个版本

0.7.0-beta.12024年7月30日
0.6.3 2024年1月7日
0.6.2 2023年7月18日
0.6.1 2023年4月23日
0.0.0 2022年1月21日

#31开发工具

Download history 1/week @ 2024-05-29 5/week @ 2024-06-05 10/week @ 2024-07-03 48/week @ 2024-07-24 55/week @ 2024-07-31

103 每月下载量

MPL-2.0 AND GPL-2.0

10MB
290K SLoC

C 274K SLoC // 0.1% comments Rust 16K SLoC // 0.0% comments

git-cinnabar 0.7

辰砂是地球上汞的常见自然形态。它含有硫化汞,其粉末用于制造朱红色颜料。

git-cinnabar是一个git远程助手,用于与mercurial仓库交互。与其他此类助手([1] [2] [3] [4] [5] [6])不同,它底层不使用本地mercurial克隆。

目前的主要重点是使其与mozilla-central和相关mercurial仓库兼容,并支持Mozilla工作流程(如服务器测试等)。

不支持低于0.5.0版本的仓库。请首先使用版本0.5.0运行 git cinnabar upgrade

许可证

git-cinnabar源代码根据Mozilla公共许可证版本2.0(见MPL-2.0文件)的条款进行分发,部分(git-core子目录)根据GNU通用公共许可证版本2.0的条款进行分发(见git-core/COPYING文件)。

因此,git-cinnabar的二进制可执行文件根据GNU通用公共许可证版本2.0的条款进行分发。

需求

  • Git(任何版本都应该工作;cinnabarclone捆绑包需要1.4.4)。
  • 要从源代码构建
    • Rust 1.74.0或更高版本。
    • C编译器(GCC或clang)。
    • make。
    • CURL开发头文件和库(Windows除外)。请注意,在MacOS上,它们包含在SDK中。

设置

预构建的二进制文件

  • 假设您的系统上有可用的预构建二进制文件,请获取download.py脚本并运行它(需要Python 3.6或更高版本),使用

    $ ./download.py
    
  • 将下载发生的目录添加到您的PATH环境变量中。如果您已经在PATH中设置了另一个git-remote-hg项目,请确保git-cinnabar的路径排在前面。

Cargo

  • 运行以下命令

    $ cargo install --locked git-cinnabar
    $ git cinnabar setup
    

手动构建

  • 运行以下命令

    $ git clone https://github.com/glandium/git-cinnabar
    $ cd git-cinnabar
    $ make
    
  • 将git-cinnabar目录添加到您的PATH。

用法

$git clone hg:<mercurial仓库>

其中 <mercurial仓库> 可以是一个包含mercurial仓库的本地目录路径,或一个http、https或ssh URL。

本质上,像对待git仓库一样使用git,但使用 hg:: URL,而您本应使用 git:// URL。

有关Mozilla仓库的工作流程示例,请参阅 https://github.com/glandium/git-cinnabar/wiki/Mozilla:-A-git-workflow-for-Gecko-development

远程引用样式

Mercurial有两种处理git称为分支的方式:分支和书签。Mercurial分支是每个属于它们的更改集上的永久标记,而书签类似于git分支。

您可以使用 cinnabar.refs 配置来选择如何与它们交互。以下值被支持,可以是单个值,也可以是逗号分隔的列表组合

  • bookmarks:在这种模式下,mercurial仓库的书签作为 refs/heads/$bookmarks 暴露。实际上,这意味着mercurial书签作为远程git分支出现。

  • tips:在这种模式下,每个mercurial分支的最新头作为 refs/heads/$branch 暴露。同一分支的任何其他头都不会暴露。当分支只有一个头时,此模式非常有用。

  • heads:在这种模式下,mercurial仓库的头作为 refs/heads/$branch/$head 暴露,其中 $branch 是mercurial分支名称,$head 是该头的完整更改集sha1。

当这些值以组合方式使用时,分支映射将相应变化,以使每个远程引用的类型明确,并避免名称冲突。

  • 当组合 bookmarksheads 时,书签作为 refs/heads/bookmarks/$bookmarks 暴露,分支头作为 refs/heads/branches/$branch/$head 暴露(其中 $head 是头的完整更改集sha1)。

  • 当组合 bookmarkstips 时,书签作为 refs/heads/bookmarks/$bookmarks 暴露,分支提示作为 refs/heads/branches/$branch 暴露。同一分支的任何其他头都不会暴露。

  • 当合并所有 bookmarksheadstips 时,书签会以 refs/heads/bookmarks/$bookmark 的形式暴露,分支头会以 refs/heads/branches/$branch/$head 的形式暴露(其中 $head 是头部的完整更改集 sha1),除了分支头,它们会以 refs/heads/branches/$branch/tip 的形式暴露。

简写 all(也是默认值),是 bookmarksheadstips 的组合。

可以使用 remote.$remote.cinnabar-refs 配置来为每个远程仓库配置引用样式。还可以使用 cinnabar.pushrefsremote.$remote.cinnabar-pushrefs 仅在推送时使用不同的方案。

标签

可以使用以下命令获取/更新标签

$git cinnabar fetch --tags

获取特定的 mercurial 更改集

有时从远程服务器获取特定的 mercurial 更改集而不获取整个仓库可能很有用。这可以通过以下命令行完成

$git cinnabar fetch hg:<mercurial仓库> <changeset sha1>

将 git 提交转换为 mercurial 更改集以及相反操作

当处理一个不使用相同标识符的远程仓库时,事情可能会变得很复杂。Git-cinnabar 包含了命令来知道 git 提交所代表的 mercurial 更改集以及相反的操作。

以下命令将给出与给定 mercurial 更改集 sha1 对应的 git 提交

$git cinnabar hg2git<changeset>

以下命令将给出与给定 git 提交 sha1 对应的 mercurial 更改集

$git cinnabar git2hg<commit>

这两个命令都允许简写形式,只要它们是不明确的(不需要 sha1 的所有 40 个十六进制数字)。

避免元数据

在某些情况下,不希望 git-cinnabar 为所有推送的提交创建元数据。特别是对于像 Mozilla try 仓库上使用的易失性提交。

默认情况下,git-cinnabar 在推送到非发布型仓库时不会存储元数据。否则会这样做。

可以使用 remote.$remote.cinnabar-data 预设来按远程仓库更改此行为,以下值之一

  • always
  • never
  • phase

phase 是上面描述的默认值。alwaysnever 是不言自明的。

Cinnabar 克隆

对于大型仓库,初始克隆可能需要大量时间。Mercurial 服务器管理员可以安装 mercurial/cinnabarclone.py 中提供的扩展,并指向包含预生成的 git-cinnabar 元数据的 git 仓库或 bundle。有关详细信息,请参阅扩展文件。

克隆仓库的用户将自动从 git 仓库或 bundle 获取元数据,然后从 Mercurial 仓库拉取缺失的更改集。

限制

目前,推送仅限于非合并提交。

不支持以下Mercurial特性

  • 过时标记
  • 阶段
  • 命名空间

检查损坏

Git-cinnabar还处于早期阶段,其元数据可能由于某些原因而损坏。

以下命令可以检测各种类型的元数据损坏

gitcinnabar fsck

此命令将修复它可以修复的损坏,并调整一些包含在较新版本中变得不再必要的项目的元数据。

可以使用--full选项对元数据内容进行更彻底的验证。使用此选项会增加大量工作量,且在大小与mozilla-central相似的仓库上,该命令可能需要超过半小时。

hg:// URL

msys shell(不是msys2)在跨msys/native边界时不会保留hg::url的完整性,因此在msys shell中运行带有本地git的cinnabar时,URL会被篡改为hg;;proto;\host\path\,这是git所不理解,甚至不会开始重定向到git-remote-hg。

为了允许此类设置仍然可以使用,支持hg:// URL。但由于mercurial可以在多种不同的协议上使用,我们滥用提供的URL中的端口号来传递协议。

因此,hg:// URL看起来如下

hg://<host>[:[<port>.]<protocol>]/<path>

默认协议是https,端口号可以省略。

  • hg::https://hg.mozilla.org/mozilla-central变为hg://hg.mozilla.org/mozilla-central

  • hg::http://hg.mozilla.org/mozilla-central变为hg://hg.mozilla.org:http/mozilla-central

  • hg::ssh://hg.mozilla.org/mozilla-central变为hg://hg.mozilla.org:ssh/mozilla-central

  • hg::file:///some/path变为(笨拙的)hg://:file/some/path

  • hg::http://localhost:8080/foo变为hg://localhost:8080.http/foo

  • hg::tags:变为hg://:tags

兼容性

截至版本0.7,Mercurial仓库中的一些边缘情况将生成与git-cinnabar先前版本不同的git提交。这意味着新鲜克隆可能与现有克隆的git SHA-1不同,但这不会影响使用较新版本的git-cinnabar与现有克隆一起使用。

大多数仓库应该不会受到影响。

可以将git配置中的cinnabar.compat设置为0.6以保留以前的行为。

实验性功能

Git-cinnabar有一系列可以独立启用的实验性功能。您可以将cinnabar.experiments git配置设置为以逗号分隔的这些功能的列表,以启用所选功能。

可用的功能有

  • 合并

    Git-cinnabar目前不允许推送合并提交。主要原因在于生成这些合并的正确mercurial数据很复杂,并且需要准确无误。

    这种实验性推送合并支持的主要缺陷是,它目前无法像mercurial那样处理其中一个分支上文件被移动的情况(即信息将丢失给mercurial用户)。

  • 相似度

    Git不跟踪文件复制或重命名。然而,它有标志尝试在事后检测它们。另一方面,Mercurial会跟踪复制和重命名,如果它们最初是手动记录的。Git-cinnabar在推送新提交到Mercurial仓库时进行精确复制/重命名检测。

    相似度功能允许配置如何检测(不)相似文件是否被视为重命名或复制。默认值为similarity=100,这意味着只有100%相同的文件会被考虑。similarity=90表示90%相同的文件,依此类推。

    这相当于git diff -C -C${similarity}%

依赖项

~22–37MB
~633K SLoC