2010-04-21 43 views
8

Khi thay đổi VCS cho dự án của tôi FakeItEasy từ SVN sang Mercurial trên Google Code Tôi hơi quá háo hức (tôi buồn cười như thế). Những gì tôi đã làm là chỉ cần kiểm tra phiên bản mới nhất của SVN và sau đó cam kết thanh toán đó như là phiên bản đầu tiên của repo Mercurial mới. Điều này rõ ràng là có hiệu lực mà tất cả lịch sử bị mất.Thêm thay đổi từ một kho lưu trữ Mercurial sang một kho lưu trữ Mercurial khác

Sau đó khi nhận được một chút tốt hơn quen với Mercurial tôi nhận ra rằng có một điều như là một "phần mở rộng chuyển đổi" cho phép bạn chuyển đổi một repo SVN thành một repo Mercurial. Bây giờ những gì tôi muốn làm là để chuyển đổi repo SVN cũ và sau đó có tất cả các bộ thay đổi từ repo Mercurial hiện tại được nhập vào repo này ngoại trừ cam kết đầu tiên cho Mercurial.

Tôi đã chuyển đổi repo SVN thành một repo Mercurial địa phương nhưng bây giờ là khi tôi bị mắc kẹt. Tôi nghĩ rằng tôi có thể sử dụng phần mở rộng chuyển đổi để mang lại kho Mercurial hiện tại vào một chuyển đổi và có một bản đồ ghép nối loại bỏ cam kết đầu tiên nhưng tôi dường như không thể làm điều này để làm việc.

Tôi cũng đã cố gắng chỉ sử dụng chuyển đổi mà không có bản đồ mối nối để nhận tất cả các bộ thay đổi từ hiện tại Mercurial repo thành chuyển đổi và rebase phiên bản thứ hai trong hiện tại đến cam kết cuối cùng từ kho SVN cũ nhưng tôi cũng không thể làm được điều đó.

Để làm rõ ràng hơn này cho phép nói rằng tôi có hai kho này:

A: revA1-revA2 
B: revB1-revB2-revB3 (Where revB1 is actually a copy of revA2) 

Bây giờ tôi muốn kết hợp hai thành kho chứa mới này:

C: revA1-revA2-revB2-revB3 

Trả lời

11

Vì vậy, miễn là bạn thay đổi băm trên các bản sửa đổi mới (bạn), bạn cũng có thể chỉ cần sử dụng exportimport (hoặc lệnh transplant là một trình bao bọc xung quanh cả hai).

Bạn đã đã chuyển đổi của bạn, đó là rất tốt, bây giờ đi vào repo B và làm:.

hg export -o 'changeset-%R.patch' 1:tip 

rằng sẽ tạo ra một changeset - vá cho mỗi changeset trong repo B ##, ngoại trừ người đầu tiên (số không).

Bây giờ đi đến repo C và nhập chúng:

hg import $(ls *.patch | sort -V) 

tất cả Điều đó sẽ áp dụng sạch nếu thực sự là revA2 và revB1 là giống hệt nhau.

+0

này hoạt động hoàn hảo, ngoại trừ một điều. Tôi không thể có vẻ để có được nhập khẩu để làm việc với các ký tự đại diện vì vậy tôi đã phải làm một nhập khẩu cho mỗi tập tin vá lỗi, nhưng tôi chỉ phải làm điều này một lần nào. Cảm ơn! –

+1

Yeah thẻ hoang dã sẽ chỉ làm việc trên unix nơi vỏ của bạn không glob mở rộng. Trên cửa sổ mỗi ứng dụng cần logic đó, vì vậy nếu bạn đang ở trên cửa sổ, bạn sẽ cần một vòng lặp FOR hoặc chỉ chạy từng cái như bạn đã làm. Vui vì nó hoạt động. –

+0

Nó có thể không hoạt động trên Linux cũng vì một lý do đơn giản: changesets được đánh số bằng cách sử dụng một số chữ số (tức là 1,2,3, ..., 10,11, ... 100,101, v.v.), gây ra ' changeset-10.patch' được nhập trước 'changeset-2.patch' theo mở rộng vỏ bình thường. Bạn nên sắp xếp chúng: 'hg nhập $ (ls * .patch | sort -V)' –

0

Bạn có thể kéo những thay đổi từ một kho lưu trữ không liên quan với "hg pull --force"

Đây là một ví dụ sử dụng đơn giản:

thiết lập các thư mục kiểm tra

C:\temp>mkdir hgtest 
C:\temp>cd hgtest 
C:\temp\hgtest>mkdir a 
C:\temp\hgtest>mkdir b 
C:\temp\hgtest>mkdir c 

làm kho a

C:\temp\hgtest>cd a 
C:\temp\hgtest\a>hg init 
C:\temp\hgtest\a>echo line one >> file.txt 
C:\temp\hgtest\a>hg add file.txt 
C:\temp\hgtest\a>hg ci -m "check in one" 
C:\temp\hgtest\a>echo line two >> file.txt 
C:\temp\hgtest\a>hg ci -m "check in two" 
C:\temp\hgtest\a>echo line three >> file.txt 
C:\temp\hgtest\a>hg ci -m "check in three" 

tạo kho b

C:\temp\hgtest\a>cd ..\b 
C:\temp\hgtest\b>copy ..\a\file.txt file.txt 
C:\temp\hgtest\b>hg init 
C:\temp\hgtest\b>hg add file.txt 
C:\temp\hgtest\b>hg ci -m "check in b one" 
C:\temp\hgtest\b>echo line four >> file.txt 
C:\temp\hgtest\b>hg ci -m "check in b two" 
C:\temp\hgtest\b>echo line five >> file.txt 
C:\temp\hgtest\b>hg ci -m "check in b three" 

làm kho c như một bản sao đầu tiên của một, sau đó kéo trong những thay đổi từ b

C:\temp\hgtest\b>cd ..\c 
C:\temp\hgtest\c>hg clone C:\temp\hgtest\a . 
C:\temp\hgtest\c>hg pull --force C:\temp\hgtest\b 
C:\temp\hgtest\c>hg merge 
C:\temp\hgtest\c>hg ci -m "check in c one" 
+0

Có, vấn đề với điều này là tôi nhận được cam kết đầu tiên vào kho B bao gồm mà tôi không muốn . Trừ khi tôi nhìn cái gì đó. –

+0

Bạn sẽ có tất cả các sửa đổi từ cả hai kho (bao gồm cả bản sao), nhưng nó sẽ hợp nhất mà không có xung đột. Nó để lại cho bạn một lịch sử sửa đổi hơi lộn xộn hơn so với giải pháp xuất/nhập. –

Các vấn đề liên quan