2008-09-24 38 views
5

chúng tôi đang sử dụng git-svn để quản lý các chi nhánh của một repo SVN. Chúng tôi đang đối mặt với vấn đề sau: sau một số cam kết của người dùng X trong chi nhánh, người dùng Y muốn sử dụng git-svn để hợp nhất các thay đổi trong nhánh thành trunk. Vấn đề chúng tôi thấy là thông báo cam kết cho tất cả các hoạt động hợp nhất riêng lẻ trông giống như chúng được tạo bởi người dùng Y, trong khi thay đổi thực tế trong nhánh được tạo bởi người dùng X.git-svn hợp nhất và cam kết chi tiết

Có cách nào để chỉ ra git-svn rằng khi hợp nhất, hãy sử dụng thông báo/tác giả cam kết ban đầu cho một thay đổi nhất định chứ không phải là người thực hiện hợp nhất?

Trả lời

13

Trang người dùng git-svn khuyên bạn không sử dụng hợp nhất. "" Bạn nên chạy lệnh git-svn fetch và rebase (không kéo hoặc hợp nhất) "". Có nói rằng, bạn có thể làm những gì bạn thích :-)

Có 2 vấn đề ở đây. Đầu tiên là svn chỉ lưu trữ commiter, chứ không phải tác giả của bản vá như git. Vì vậy, khi Y cam kết việc sáp nhập vào thân cây, svn chỉ ghi lại tên của cô ấy, mặc dù các bản vá được tác giả bởi X. Đây là một tính năng tuyệt vời nhưng quan trọng đối với các dự án mã nguồn mở. vấn đề pháp lý xuống đường.

Thứ hai, git dường như không sử dụng các tính năng hợp nhất svn mới. Đây có thể là một điều tạm thời, vì git đang tích cực phát triển và các tính năng mới được thêm vào mọi lúc. Nhưng hiện tại, nó không sử dụng chúng.

Tôi vừa thử với git 1.6.0.2 và thông tin "mất" so với thực hiện thao tác tương tự với hợp nhất svn. Trong svn 1.5, một tính năng mới được bổ sung vào các phương pháp khai thác gỗ và chú thích, do đó -g svn log trên thân cây sẽ ra một cái gì đó như thế này cho một hợp nhất:

------------------------------------------------------------------------ 
r5 | Y | 2008-09-24 15:17:12 +0200 (Wed, 24 Sep 2008) | 1 line 

Merged release-1.0 into trunk 
------------------------------------------------------------------------ 
r4 | X | 2008-09-24 15:16:13 +0200 (Wed, 24 Sep 2008) | 1 line 
Merged via: r5 

Return 1 
------------------------------------------------------------------------ 
r3 | X | 2008-09-24 15:15:48 +0200 (Wed, 24 Sep 2008) | 2 lines 
Merged via: r5 

Create a branch 

Ở đây, Y cam kết r5, trong đó kết hợp các thay đổi từ X trên nhánh vào thân cây. Định dạng của nhật ký không phải là thực sự là tuyệt vời, nhưng nó đi vào riêng của mình trên svn đổ lỗi -g:

 2   Y int main() 
     2   Y { 
G  4   X return 1; 
     2   Y } 

Ở đây giả sử Y chỉ cam kết thân cây, chúng ta có thể thấy rằng một dòng được ngồi biên tập bởi X (trên chi nhánh) và sáp nhập.

Vì vậy, nếu bạn đang sử dụng svn 1.5.2, bạn có thể tốt hơn khi hợp nhất với ứng dụng khách thực sự của svn ngay bây giờ. Mặc dù bạn sẽ mất thông tin hợp nhất trong git, nó thường đủ thông minh để không phàn nàn.

Cập nhật: Tôi vừa thử điều này với git 1.7.1 để xem liệu có bất kỳ tiến bộ nào trong thời gian tạm thời không. Tin xấu là hợp nhất trong git vẫn không điền giá trị svn: mergeinfo, vì vậy git merge theo sau là git svn dcommit sẽ không đặt svn: mergeinfo và bạn sẽ mất thông tin hợp nhất nếu kho lưu trữ Subversion là nguồn chuẩn tắc. Tin tốt là git svn clone không đọc thuộc tính svn: mergeinfo để xây dựng lịch sử hợp nhất tốt hơn, vì vậy nếu bạn sử dụng chính xác svn merge (yêu cầu hợp nhất toàn bộ nhánh) thì git clone sẽ chính xác với người dùng git.

+1

'git svn dcommit' hiện có thể đẩy' svn: mergeinfo': Xem https://www.kernel.org/pub/software/scm/git/docs/git-svn.html (tìm kiếm "mergeinfo") –

6

Bạn có thể sử dụng ghép để dạy git về các lần hợp nhất không được biểu thị trong đối tượng cam kết được đề cập.

echo "$merge_sha1 $parent1_sha1 $parent2_sha1" >> .git/info/grafts 

Tìm thông tin này là đủ đơn giản: cho thấy việc hợp nhất cam kết trong câu hỏi, bạn biết $merge_sha1$parent1_sha1 rồi.Thông thường, các cam kết thông báo như vậy một cam kết sẽ chứa các số phiên bản SVN của cha mẹ thứ hai cam kết, mà bạn chỉ cần dịch để tương ứng với cam kết ID:

git svn find-rev r$revnum $branch 

Presto, bạn có tất cả 3 mẩu thông tin bạn cần tạo ghép.

2

Hãy thử sử dụng tùy chọn --add-author-from và --use-log-author cho git-svn.

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