9

我是一名前端设计师,没有大量的编程背景。我做 CSS/html 和一点 JavaScript。我们公司的技术团队已将我们的版本控制从 Git (github) 转移到 Mercurial (Kiln)。他们的唯一原因是获得 Kiln 的代码审查功能(我们使用 Fogbugz 并且喜欢它)。

问题是在我们的版本控制中工作的前端人员和非开发人员一直在搞砸。我们使用 hg-git 部署在 Heroku 上并习惯于 git(从未与其他版本控制系统合作过)。我确信 Mercurial 是一个很棒的工具,但我必须得出结论,我们在问题和错误上花费了太多时间。

我的想法是:有没有办法在 github 上使用 git,然后将所有提交等同步到 Mercurial(Kiln)?然后我们就可以使用 git 并且仍然拥有 Kiln 的代码审查功能。

希望你能帮忙。我很想带着解决方案回到我们的技术团队;)

4

4 回答 4

8

您设置的任何同步都将比仅仅学习 Mercurial 更容易出错。Git 和 Mercurial 都是很棒的工具,而且非常相似,因此如果不是逐个任务地进行,而是花一个小时阅读不同之处,您将能够毫无问题地来回切换。

不太好的同步选项是:git-hg、hgit 和 Mercurial 的转换扩展,以及 Mercurial 对 git 子存储库的支持,但你会后悔其中的任何一个,因为它们需要对这两种工具有更深入的了解,而不是使用其中任何一种一个人会。

要么让开发人员切换回来,要么让他们为你重写你的部署内容,但不要打扰跨越同一家公司。

于 2011-03-30T14:05:16.250 回答
3

今天 Kiln v3 与 Kiln Harmony 一起发布,它具有原生 Git 支持(事实上,它允许 Mercurial 和 Git 在同一个 repos 上!)。

作为 Mercurial 的粉丝,我编写了一个脚本来定期将 Kiln Repo 与 GitHub 同步,这样我就可以在 GitHub 上托管我的代码,但每天仍然只使用 Mercurial。

最新版本的 PowerShell 函数以 Gist 的形式提供,但为了方便起见,我也在此处粘贴了当前版本。

<#
.SYNOPSIS
    Script to sync a GitHub repo to Kiln to allw GitHub contributions without using Git (use Hg on your Kiln repos!).
.DESCRIPTION
    Create a branch repo in Kiln specifically for for the GitHub sync and run this PS script periodically (PoSh v3
    scheduled jobs make this easy).

    Merge the GitHub branch repo (using Hg!) into your main repo periodically, then push back to the GitHub branch
    once done. This will be sync'd back to GitHub when the script next runs.

    Avoid simultaneous changes in the GitHub repo and the Kiln GitHub branch repo, as we don't want the automated
    script merging (esp. as they could conflict).
.EXAMPLE
    Sync-GitRepositories `
        "$kilnBase/Misc/Group/NewSyncTest-GitHub.git" `
        "$githubBase/NewSyncTest.git" `
        "$tempSyncBase\Scripted"
#>
function Sync-GitRepositories
{
    param(
        [Parameter(Mandatory)]
        [string]$gitRepo1,
        [Parameter(Mandatory)]
        [string]$gitRepo2,
        [Parameter(Mandatory)]
        [string]$tempSyncPath,
        [string]$gitExecutable
    )

    # If we weren't given a path to git, assume it's in the path.
    if (!$gitExecutable)
        { $gitExecutable = "git" }

    # Clone the Kiln Github branch repo if we haven't already got a copy.
    if (!(Test-Path $tempSyncPath))
    {
        & $gitExecutable clone $gitRepo1 $tempSyncPath | Out-Default
        Push-Location $tempSyncPath

        # Add a remote for the GitHub repo that we're syncing with.
        & $gitExecutable remote add github $gitRepo2 | Out-Default
    }
    else
    {
        Push-Location $tempSyncPath
    }

    # Fetch changes from the Kiln GitHub branch repo and merge them in.
    # Note: Use FastForward-Only to avoid merging (this is automated!), if changes are made to
    # both GitHub and Kiln GitHub branch simultaneously, we'll have to manually resolve it.
    # Errors from this script should be emailed to the user!
    # Note: Always use -q because Git writes progress to STDERR! #WTF
    & $gitExecutable fetch origin -q | Out-Default
    & $gitExecutable merge origin/master --ff-only -q | Out-Default

    # Repeat the process with any changes from GitHub.
    & $gitExecutable fetch github -q | Out-Default
    & $gitExecutable merge github/master --ff-only -q | Out-Default

    # Push changes back to both Kiln GitHub branch repo and GitHub repo.
    & $gitExecutable push origin : -q | Out-Default
    & $gitExecutable push github : -q | Out-Default

    Pop-Location
}
于 2013-03-12T19:32:40.880 回答
2

也许您可以使用 git post-commit 挂钩将您的更改推送/同步到 Kiln 使用git-hg

于 2011-03-30T09:15:23.520 回答
0

您还可以在 Kiln 中设置自定义 Web Hook以从 Kiln 同步到 Git。

于 2012-01-24T16:28:38.750 回答