2011-03-30 4 views
9

Я являюсь дизайнером интерфейса и не имею большого фона программирования. Я делаю CSS/html и немного JavaScript. Техническая команда в нашей компании перенесла наш контроль версий с Git (github) на Mercurial (Kiln). Единственная причина для них - получить функцию обзора кода в Kiln (мы используем Fogbugz и любим его).Автоматическая синхронизация между Github и Kiln

Проблема заключается в том, что фронтмены и разработчики, работающие в нашем контроле версий, постоянно работают. Мы используем hg-git для развертывания на Heroku и используются для git (никогда не работали с другими системами управления версиями). Я уверен, что Mercurial - отличный инструмент, но я должен заключить, что мы тратим слишком много времени на проблемы и ошибки.

Моя мысль была: Есть ли способ использовать git на github, а затем синхронизировать все коммиты и т. Д. С Mercurial (Kiln)? Затем мы будем использовать git и все еще иметь функции обзора кода Kiln.

Надеюсь, вы сможете помочь. Я хотел бы вернуться в нашу техническую команду с решением;)

ответ

8

Любая синхронизация, настроенная вами, будет более подверженной ошибкам, чем просто изучение Mercurial. Git и Mercurial являются отличными инструментами и очень похожими, поэтому, если вместо этого вы планируете поэтапную задачу по задаче, вы хорошо читаете о различиях, которые вы сможете переключать туда и обратно без каких-либо проблем.

Не-большие вариантов для синхронизации являются: ГИТ-рт.ст., hgit и расширение новообращенного Mercurial, и поддержка Mercurial для GIT subrepositories, но вы будете сожалеть ни один из них, потому что они требуют большего понимания как инструментов, чем использование одного из них.

Либо заставьте разработчиков откидываться назад, либо заставлять их переписывать свои материалы для развертывания, но не беспокойтесь о том, чтобы переходить в одну компанию.

2

Возможно, вы могли бы использовать git post-commit hook, чтобы нажимать/синхронизировать ваши изменения в Kiln, используя git-hg?

+0

Спасибо, я загляну в него :) – nikstep

+1

Интересно. Я вообще не прочь проголосовать, но я бы не прочь пояснить :) Я тоже здесь, чтобы учиться! –

+1

Мне тоже любопытно, что это был более полезный ответ, чем «правильный» с моей наивной точки зрения? У кого-нибудь есть объяснение? Я только что воздержался ... –

3

Сегодня Kiln v3 был запущен с Kiln Harmony, который имеет встроенную поддержку Git (на самом деле, он позволяет и Mercurial, и Git на тех же репозиториях!).

Являясь поклонником Mercurial, я написал сценарий для периодической синхронизации Kiln Repo с GitHub, поэтому я могу разместить свой код на GitHub, но на ежедневной основе использовать Mercurial.

Последняя версия the PowerShell function is available as a 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 
} 
Смежные вопросы