2009-03-24 31 views
25

Tôi đang sử dụng git-svn để lưu trữ phiên bản "dàn dựng" của một số repo SVN, nơi người dùng khác được phép kéo từ repo dàn dựng này và cam kết có thay đổi về nó, sau đó cam kết trên repo dàn được định kỳ cam kết repo SVN ngược dòng.Lập bản đồ giữa các ủy viên git và người dùng SVN

Tôi muốn biết nếu có cách nào để ánh xạ giữa tên của các ủy viên git và tên người dùng SVN, sao cho thông tin của họ sẽ được giữ nguyên khi cam kết trở lại repo SVN?

Trả lời

24

Vincent Danen không đề cập đến the -A option when using git svn:

Vì vậy, sử dụng ~/git như một thư mục cấp cao nhất cho Git kho [...] tạo ra một tập tin authors.txt.
Tệp này sẽ ánh xạ tên của các ủy ban Subversion cho các tác giả Git, dẫn đến lịch sử chính xác của kho lưu trữ Subversion đã nhập.
Đối với các dự án có số lượng người đăng ký nhỏ, điều này khá dễ dàng. Đối với các dự án lớn hơn với rất nhiều người đăng ký, điều này có thể mất một thời gian. Cú pháp của tập tin sẽ là:

user = Joe User <[email protected]> 
vdanen = Vincent Danen <[email protected]> 

các tên viết tắt là tên committer cho Subversion trong khi dạng dài là của người dùng tên và e-mail đầy đủ địa chỉ, như được sử dụng bởi Git.

Bước cuối cùng là sao chép kho lưu trữ Subversion, tạo kho lưu trữ Git cục bộ dựa trên đó. Giả sử kho của bạn sử dụng các tiêu chuẩn của/trunk,/thẻ, và/chi nhánh, sử dụng:

# git svn clone --no-metadata -A authors.txt -t tags -b branches -T trunk https://svn.example.com/svn/repo 

-A<filename> 
--authors-file=<filename> 

Cú pháp tương thích với các tập tin được sử dụng bởi git-cvsimport:

loginname = Joe User <[email protected]> 

Nếu tùy chọn này được chỉ định và git-svn gặp tên người gửi SVN không tồn tại trong tác giả -file, git-svn sẽ hủy bỏ hoạt động.
Sau đó, người dùng sẽ phải thêm mục nhập phù hợp.
Chạy lại lệnh git-svn trước đó sau khi tệp tác giả được sửa đổi sẽ tiếp tục hoạt động.

config key: svn.authorsfile 

này nên làm việc cho tất cả git-svn lệnh, bao gồm git-svn dcommit (khi bạn đẩy - SVN) (Lưu ý: Tôi đã không kiểm tra nó trực tiếp mặc dù).

Mohammed Gamal báo cáo (trong nhận xét) đang hoạt động nhưng không có tùy chọn --no-metadata.

+1

Điều đó cũng hoạt động theo hướng git-> svn, như được hỏi bởi OP? –

+0

@Christoph: nhân tiện, bạn * làm * có một gương SVN của một repo Git (http://stackoverflow.com/questions/570945/git-clone-of-git-svn-tree/571084#571084). Bạn đã bao giờ phải sử dụng tùy chọn --authors-file? – VonC

+2

Giải pháp của bạn hoạt động, nhưng không có chuyển đổi --no-metadata –

1

tùy chọn thứ hai là cung cấp chương trình/tập lệnh giải quyết ánh xạ.

Rất hữu ích nếu có số lượng người gửi không xác định nhưng có thể "được tạo" từ tên người gửi SVN!

Nếu… Tên người gửi không có trong tệp tác giả, git svn sẽ hủy bỏ hoạt động. Sau đó, người dùng sẽ phải thêm mục nhập thích hợp. Re-chạy lệnh git svn trước đó sau khi các tác giả-file được sửa đổi ...

như vậy, do chúng ta có:

--authors-prog=mapMyCompanyUsers.sh 

Để không có lực lượng mọi người sử dụng để kiểm tra/curl/wget'ting sự Bản đồ-Script đầu tiên, bạn có thể cung cấp một cái gì đó như thế này:

$(tmpMapFile="$TMPDIR/mapSvnUsersAutomatically.$$.sh" && echo -e '#!/bin/sh\necho $1" <"$1"@example.com>"' > $tmpMapFile && chmod +x $tmpMapFile && echo $tmpMapFile) 

Chiếc máy nhái sẽ trông giống như:

$ git svn clone -s --authors-prog=$(tmpMapFile="$TMPDIR/mapSvnUsersAutomatically.$$.sh" && echo -e '#!/bin/sh\necho $1" <"$1"@example.com>"' > $tmpMapFile && chmod +x $tmpMapFile && echo $tmpMapFile) https://svn.example.com/svn/repo/ 

Điều này sẽ buộc tất cả các ánh xạ đều giống nhau và các bản sao SVN có thể được "chia sẻ" và được hợp nhất qua git!

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