Tôi di chuyển sang git bằng git-svn. Kho svn của chúng tôi vẫn còn nguyên vẹn và chúng tôi vẫn nhận được tất cả các "git awesomeness". Về cơ bản sau khi git-svn nhân bản bạn phân nhánh lại thành 'thân cây' của bạn. Mọi người sử dụng git sẽ phân nhánh từ đây. Khi bạn cần cập nhật từ svn, bạn chỉ cần thực hiện lệnh git-svn rebase và sau đó thực hiện git merge --squash từ nhánh svn đến new 'trunk'. Và ngược lại. Điều này có nghĩa là lịch sử của bạn trên repo svn sẽ không khớp với những gì trong git. Khi bạn làm nhiều hơn thì một hợp nhất, tại một số điểm bạn sẽ phải bắt đầu ghép các cam kết vì lịch sử không khớp. Tuy nhiên, nếu bạn ghép HEAD của git trunk của bạn đến id cam kết cuối cùng đã được hợp nhất đè bẹp, bạn sẽ nhận được cùng một hiệu ứng.
Ok vì vậy, hãy để tôi giải thích điều này tốt nhất có thể với ví dụ.
svn repo: svn: //xyz.com/myproject
git svn clone svn://xyz.com/myproject
này nên để lại cho bạn với một thiết lập git-svn bình thường với một chi nhánh tổng thể trong đó có lịch sử tương tự như kho svn.
git checkout -b git_trunk
git_trunk trở thành "thân cây" cho người dùng git.
Chi nhánh này có thể được sử dụng tự do như bất kỳ kho lưu trữ git nào khác.
Bây giờ bạn cần phải đồng bộ hóa hai chi nhánh này qua git merge --squash
Ví dụ .. sáp nhập từ các chi nhánh chủ svn để git_trunk
git checkout git_trunk
git merge --squash master
git commit -a
Bạn sẽ làm điều tương tự để sáp nhập từ git_trunk để làm chủ svn ngoại trừ bạn sẽ thực hiện
git svn dcommit
này sẽ đẩy nó trở lại svn.
Vì vậy, phần phức tạp ở đây là vì chúng tôi đang sử dụng --squash lịch sử hợp nhất bị mất và git tổ tiên chung duy nhất sẽ biết là điểm chi nhánh. Điều này có nghĩa là xung đột hợp nhất.Cách tôi giải quyết nó là bằng cách làm một cái gì đó như thế này
Hợp nhất từ git_trunk để làm chủ. Đầu tiên tôi lấy id commit của squash cuối cùng trên git_trunk. Cho phép gọi nó là ABCDEFG. Sau đó, tôi nhận được cam kết-d của git_trunk. Cho phép nói HIJKLMNO của nó
echo "HIJKLMNO ABCDEFG" > .git/info/grafts
Điều này sẽ cho git khi hợp nhất tổ tiên chung nhất là cam kết đè bẹp gần đây nhất.
Nó không hoàn hảo nhưng nó hoạt động tuyệt vời cho tôi. Đặc biệt là bây giờ kể từ khi hầu như tất cả mọi người là trên git.
Bạn thực sự không nên gặp vấn đề về lật đổ như vậy. Kho lưu trữ Subversion mà chúng tôi quản lý tại nơi làm việc khá lớn (hơn 10.000 tệp) và chúng tôi chưa bao giờ có bất kỳ vấn đề tham nhũng nào với nó. Âm thanh giống như một vấn đề phần cứng, tham nhũng tùy ý sẽ không bao giờ xảy ra. – Kezzer
Tôi đoán kho lưu trữ của bạn không được sử dụng bởi những người không lập trình :) Họ có thể phá vỡ mọi thứ. – vava
@vava: Những người không lập trình có thể có thể bẻ khóa copy_ của họ và mất rất nhiều công việc, nhưng họ chắc chắn không thể phá vỡ _repository_. Một cái gì đó có vẻ như là cá ở đó và nếu tôi là bạn, tôi sẽ cố gắng tìm ra cách điều này xảy ra trước khi làm bất cứ điều gì khác. – sbi