2011-03-30 37 views
9

Tôi là một nhà thiết kế giao diện người dùng và không có nền tảng lập trình lớn. Tôi làm CSS/html và một chút JavaScript. Đội ngũ kỹ thuật tại công ty chúng tôi đã chuyển điều khiển phiên bản của chúng tôi từ Git (github) sang Mercurial (Kiln). Lý do duy nhất cho họ là lấy tính năng xem xét mã của Kiln (chúng tôi sử dụng Fogbugz và yêu thích nó).Đồng bộ hóa tự động giữa Github và Kiln

Vấn đề là các frontenders và non-developers làm việc trong điều khiển phiên bản của chúng tôi luôn sẵn sàng. Chúng tôi sử dụng hg-git để triển khai trên Heroku và được sử dụng để git (không bao giờ làm việc với các hệ thống kiểm soát phiên bản khác). Tôi chắc chắn rằng Mercurial là một công cụ tuyệt vời, nhưng tôi phải kết luận rằng chúng tôi dành quá nhiều thời gian cho các vấn đề và sai sót.

Suy nghĩ của tôi là: Có cách nào để sử dụng git trên github và sau đó đồng bộ hóa tất cả các cam kết vv với Mercurial (Kiln)? Sau đó, chúng tôi sẽ sử dụng git và vẫn có các tính năng đánh giá mã của Kiln.

Hy vọng bạn có thể trợ giúp. Tôi rất thích quay trở lại nhóm công nghệ của chúng tôi với một giải pháp;)

Trả lời

8

Bất kỳ đồng bộ hóa nào bạn thiết lập sẽ dễ bị lỗi hơn là chỉ học Mercurial. Git và Mercurial là cả hai công cụ tuyệt vời, và rất giống nhau, vì vậy nếu thay vì thực hiện nhiệm vụ từng phần, bạn dành một giờ tốt để đọc về sự khác biệt bạn có thể chuyển đổi qua lại mà không gặp bất kỳ vấn đề gì.

Tùy chọn tuyệt vời để đồng bộ hóa là: git-hg, hgit, và phần mở rộng chuyển đổi của Mercurial, và hỗ trợ Mercurial cho git subrepositories, nhưng bạn sẽ hối tiếc vì chúng sẽ yêu cầu hiểu rõ hơn về cả các công cụ hơn là chỉ sử dụng một trong hai công cụ đó.

Hoặc làm cho các nhà phát triển chuyển trở lại hoặc làm cho họ viết lại công cụ triển khai của bạn cho bạn, nhưng đừng lo lắng nằm trong cùng một công ty.

2

Có lẽ bạn có thể sử dụng móc git sau cam kết để đẩy/đồng bộ hóa các thay đổi của bạn với Lò sử dụng git-hg?

+0

Cảm ơn, tôi sẽ xem xét nó :) – nikstep

+1

Thú vị. Tôi không ngại bỏ phiếu, nhưng tôi sẽ không để ý một lời giải thích nữa :) Tôi cũng ở đây để học hỏi! –

+1

Tôi tò mò về cuộc bỏ phiếu xuống quá - có vẻ như đó là hữu ích hơn một câu trả lời hơn là "đúng một" từ quan điểm ngây thơ của tôi xem? Bất kỳ ai cũng có giải thích? Tôi đã bỏ phiếu ngay bây giờ ... –

3

Hôm nay Kiln v3 đã được khởi chạy với Kiln Harmony có hỗ trợ Git gốc (trên thực tế, nó cho phép cả Mercurial và Git trên cùng một repos!).

Là một fan của Mercurial, tôi đã viết một kịch bản để đồng bộ hóa một Kiln Repo định kỳ với GitHub để tôi có thể lưu trữ mã của tôi trên GitHub nhưng vẫn chỉ sử dụng Mercurial hàng ngày.

Phiên bản mới nhất của the PowerShell function is available as a Gist, nhưng tôi cũng đã dán phiên bản hiện tại vào đây để thuận tiện.

<# 
.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 
} 
Các vấn đề liên quan