2009-03-18 42 views
47

Tôi có các dự án của tôi trong 2 kho lưu trữ. Một dưới SVN và một dưới Git. Bất cứ khi nào tôi thay đổi một cái gì đó trong SVN tôi muốn làm điều tương tự với kho Git.Làm thế nào để áp dụng SVN diff to Git?

Giả sử tôi thực hiện thay đổi đối với kho SVN, sửa đổi 125. Làm cách nào để áp dụng những thay đổi tương tự cho kho lưu trữ Git của tôi (giả sử kho lưu trữ Git của tôi được cập nhật với bản sửa đổi 124).

Cảm ơn bạn.

Trả lời

46

Những gì tôi thực sự đã làm/tìm kiếm là:

cd /path/to/svn/repo 
svn diff -r 125 > /tmp/patch.diff 
cd /path/to/git/repo 
patch -p0 < /tmp/patch.diff 
+1

nó không hoạt động tốt lắm! –

+1

Xin lỗi, đây thực sự là tình huống cụ thể. Tôi đề nghị bạn gửi một câu hỏi nếu bạn đang gặp rắc rối: ( – drozzy

+1

Nói chung, git-svn là một cách tốt hơn để nhập (và xuất) svn commit vào kho git, nó sẽ giữ thông điệp cam kết và thông tin tác giả, và đối phó với nhiều Tất nhiên, kịch bản này có thể thích hợp hơn cho tình huống của bạn nếu có những ràng buộc bên ngoài mà bạn chưa thảo luận ở đây) – Rich

18

Hãy thử:

svn diff | patch -d /path/to/git/repo -p0 

Xem svn help diff nếu bạn muốn xuất diff một phiên bản cụ thể.

+1

Tại sao không làm việc này với -p0 được rời đi? –

+0

Xem -pnum trong http://linux.die.net/man/1/patch Trong tìm kiếm cụ thể trang cho các từ "không chỉ định -p". Tôi nghĩ nếu bạn không chỉ định nó - patch sẽ bỏ qua filepath và chỉ sử dụng tên tập tin. – drozzy

2

Ngoài việc sử dụng bản vá như đã đề cập ở trên, bạn cũng có thể xem xét việc thiết lập một post-commit hook vì vậy bạn không cần phải làm điều này mỗi khi bạn cam kết những điều mới mẻ.

5

Tại sao không ai thích git-svn? Tôi không thể cho rằng không ai biết về nó.

Có git-svn (và git-hg và git-cvs và git-bzr afaict). Ít nhất là với git-svn bạn chỉ có thể làm

git svn clone --stdlayout http://myrepo/root here 

sử dụng -s (--stdlayout) giả định tiêu chuẩn trunk/chi nhánh/thẻ/bố trí, nhưng bạn có thể có nó bất kỳ mà cách (man git-svn).

Ánh xạ hai chiều, vì vậy bạn có thể đẩy và kéo như với từ xa (git) gốc. Không có câu hỏi.

+0

cảm thấy tự do để thêm một móc hậu cam kết thực hiện lệnh đẩy tự động sau khi commit :) – sehe

+0

Điều này không 't làm việc cho tôi với svn-git trên Windows như 'git apply' thất bại vì nó không thể phân tích cú pháp các đường dẫn tương đối của các diff khác biệt kiểu svn. –

+1

@the_mandrill erm ... sử dụng 'patch -p1' (hoặc -p0, hoặc bất kỳ thứ gì bạn cần phải loại bỏ) ?. Oh đợi đã. Oooold câu hỏi. Vấn đề là bạn không cần diff khác biệt về kiểu svn. 'git cherry-pick' – sehe

0

Thông tin bên dưới có hiệu quả đối với tôi.

Nguồn: How to create and apply a patch with Git

Đầu tiên, hãy nhìn vào những gì thay đổi này trong các bản vá. Bạn có thể làm điều này một cách dễ dàng với git áp dụng

git apply --stat fix_empty_poster.patch 

Lưu ý rằng lệnh này KHÔNG áp dụng các bản vá, nhưng chỉ cho bạn thấy những số liệu thống kê về những gì nó sẽ làm. Sau khi nhìn vào tệp bản vá với trình chỉnh sửa yêu thích của bạn, bạn có thể thấy những thay đổi thực sự là gì.

Tiếp theo, bạn quan tâm đến mức độ phiền hà của bản vá sẽ là. Git cho phép bạn kiểm tra bản vá trước khi bạn áp dụng nó.

git apply --check fix_empty_poster.patch 

Nếu bạn không nhận được bất kỳ lỗi nào, bản vá có thể được áp dụng sạch. Nếu không, bạn có thể thấy những rắc rối bạn sẽ gặp phải.

Để áp dụng bản vá, tôi sẽ sử dụng git am thay vì git áp dụng. Lý do cho điều này là git am cho phép bạn đăng xuất một bản vá được áp dụng. Điều này có thể hữu ích cho việc tham khảo sau này.

git am --signoff < fix_empty_poster.patch 

Applying: Added specs to test empty poster URL behaviour 
Applying: Added poster URL as part of cli output 

Được rồi, các bản vá lỗi đã được áp dụng sạch và chi nhánh chính của bạn đã được cập nhật. Tất nhiên, chạy thử nghiệm của bạn một lần nữa để đảm bảo không có gì bị hỏng.

Trong nhật ký git, bạn sẽ thấy rằng thư cam kết chứa thẻ “Đã đăng xuất”. Thẻ này sẽ được đọc bởi Github và những người khác để cung cấp thông tin hữu ích về cách cam kết kết thúc trong mã.

4

Nếu bạn đang đi để tạo ra một bản vá trong SVN và áp dụng nó với Git sau, đừng quên sử dụng --git command-line option:

--git

Kích hoạt chế độ đầu ra đặc biệt cho svn diff thiết kế cho khả năng tương thích chéo với hệ thống kiểm soát phiên bản phân phối Git phổ biến .

Ví dụ, chạy

svn diff --git -r 125 > /tmp/patch.diff

+0

svn: không hợp lệ tùy chọn: --git – sloven

+0

@Nik Tôi đoán rằng khách hàng svn của bạn là quá cũ. Kết quả của svn --version là gì? – bahrep

+0

svn phiên bản 1.6.13 – sloven

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