6个版本
0.7.0-beta.1 | 2024年7月30日 |
---|---|
0.6.3 | 2024年1月7日 |
0.6.2 | 2023年7月18日 |
0.6.1 | 2023年4月23日 |
0.0.0 |
|
#31 在 开发工具
103 每月下载量
10MB
290K SLoC
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。
当这些值以组合方式使用时,分支映射将相应变化,以使每个远程引用的类型明确,并避免名称冲突。
-
当组合
bookmarks
和heads
时,书签作为refs/heads/bookmarks/$bookmarks
暴露,分支头作为refs/heads/branches/$branch/$head
暴露(其中$head
是头的完整更改集sha1)。 -
当组合
bookmarks
和tips
时,书签作为refs/heads/bookmarks/$bookmarks
暴露,分支提示作为refs/heads/branches/$branch
暴露。同一分支的任何其他头都不会暴露。 -
当合并所有
bookmarks
、heads
和tips
时,书签会以refs/heads/bookmarks/$bookmark
的形式暴露,分支头会以refs/heads/branches/$branch/$head
的形式暴露(其中$head
是头部的完整更改集 sha1),除了分支头,它们会以refs/heads/branches/$branch/tip
的形式暴露。
简写 all
(也是默认值),是 bookmarks
、heads
和 tips
的组合。
可以使用 remote.$remote.cinnabar-refs
配置来为每个远程仓库配置引用样式。还可以使用 cinnabar.pushrefs
或 remote.$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
是上面描述的默认值。always
和 never
是不言自明的。
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