Làm cách nào để git-svn sao chép n bản sửa đổi cuối cùng từ kho Subversion?


314

Vấn đề

Làm thế nào để bạn tạo một bản sao nông với git-svn từ kho lưu trữ Subversion, ví dụ: làm thế nào để bạn chỉ kéo ba bản sửa đổi cuối cùng?

Các git clonelệnh có thể nhận được n sửa đổi cuối cùng từ một kho Git nếu bạn sử dụng tùy chọn --depth, nghĩa là bạn có được một bản sao cạn của kho. Thí dụ:

git clone --depth 3 git://some/repo myshallowcopyrepo

Có một tùy chọn tương tự cho git-svn?

Những khám phá của tôi cho đến nay

Cho đến nay tôi chỉ tìm thấy -rNtùy chọn Nđể sửa đổi. Thí dụ:

git svn clone -rN svn://some/repo

Theo các tài liệu có khả năng sử dụng -r$REVNUMBER:HEAD. Tôi đã thử các cách sau để có được 3 phiên bản mới nhất trả về thông báo lỗi.

$ git svn clone --prefix=svn/ -s -rHEAD~3:HEAD http://some/svn/repo .
revision argument: HEAD~3:HEAD not understood by git-svn

Vì vậy, tôi đã thay thế HEAD~3bằng số thực tế của lần sửa đổi thứ ba nhưng lần sửa đổi cuối cùng 534. Điều đó đã có hiệu quả, nhưng điều đó đòi hỏi tôi phải tìm ra số lần sửa đổi của lần thứ ba nhưng lần cam kết cuối cùng.

$ git svn clone --prefix=svn/ -s -r534:HEAD http://some/svn/repo .

Tài liệu

git-clone

git-svn


6
Trả lời câu hỏi của riêng tôi: -s is for --stdlayout which presumes the svn recommended layout for tags, trunk, and branches.(nhưng không hiệu quả với tôi)
Sebastián Grignoli

Làm thế nào khó khăn để thực hiện --depthcho git svn, vì đã có hỗ trợ. Và nó đã phải tìm ra rev mới nhất từ ​​máy chủ?
Peter Cordes

Câu trả lời:


238

Bạn đã phát hiện ra cách đơn giản nhất để chỉ định một bản sao nông trong Git-SVN, bằng cách chỉ định số sửa đổi SVN mà bạn muốn bắt đầu bản sao của mình tại ( -r$REV:HEAD).

Ví dụ: git svn clone -s -r1450:HEAD some/svn/repo

Cấu trúc dữ liệu của Git dựa trên các con trỏ trong biểu đồ chu kỳ có hướng (DAG), điều này khiến cho việc quay trở lại ncam kết trở nên tầm thường . Nhưng trong SVN (và do đó trong Git-SVN), bạn sẽ phải tự tìm số sửa đổi.


5
Điều gì xảy ra nếu tôi muốn tiếp tục nhân bản bản sửa đổi trước đó trong tương lai, liệu có thể?
Zennichimaro

5
@Zennichimaro: Bạn có thể làm điều đó bằng cách thêm một git-svnđiều khiển từ xa khác vào cùng một vị trí và sử dụng git-svn fetchđể lấy thêm cây. Tại thời điểm đó, bạn phải sử dụng git filter-branchđể sửa chữa cây cũ (một phần) trên nhánh bên phải.
Ben Jackson

Paul có cách nào để tôi có được các bản sửa đổi mới nhất bằng cách thực hiện Di chuyển gia tăng từ SVN sang Git ( stackoverflow.com/questions/29161646/ọ )
SabareeshSS 20/03/2015

1
SVN sử dụng các số nguyên liên tiếp để xác định các sửa đổi, làm cho nó trở nên tầm thường hơn để quay trở lại các ncam kết ...
hại vào

Tôi nghĩ rằng có một khoảng trống bị thiếu sau -r. Ví dụ: git svn clone -r 1133: TRƯỚC một số / svn / repo
Gnana

92

Tôi thấy mình thường xuyên sử dụng những điều sau đây để có được một số lượng sửa đổi hạn chế từ cây lật đổ khổng lồ của chúng tôi (chúng tôi sẽ sớm đạt đến phiên bản 35000 svn).

# checkout a specific revision
git svn clone -r N svn://some/repo/branch/some-branch
# enter it and get all commits since revision 'N'
cd some-branch
git svn rebase

Và một cách tốt để tìm ra nơi một chi nhánh bắt đầu là thực hiện svn lognó và tìm cái đầu tiên trên nhánh (cái cuối cùng được liệt kê khi làm):

svn log --stop-on-copy svn://some/repo/branch/some-branch

Cho đến nay tôi chưa thực sự tìm thấy rắc rối đáng giá trong việc theo dõi tất cả các chi nhánh. Mất quá nhiều thời gian để sao chép và svn và git không hoạt động tốt như tôi muốn. Tôi có xu hướng tạo các tệp vá và áp dụng chúng trên bản sao git của một nhánh svn khác.


1
+1 từ tôi - đã giúp tôi khắc phục lỗi 128 vấn đề Tôi đã nhân bản toàn bộ repo svn
Ian Oxley

lệnh đăng nhập svn chính xác là những gì tôi đang tìm kiếm! cảm ơn
mrbrdo

1
Các repos tôi làm việc có bố trí và phân nhánh không chuẩn, vì vậy tôi thường tạo một repo Git cục bộ cho mỗi nhánh SVN, và sau đó cherry-pick/ rebasegiữa chúng. Cam kết có thêm một bước ( pushsau đó là dcommittừ repo từ xa), nhưng tôi nghĩ rằng nó đáng để đánh đổi.
bấm giờ

Không nghĩ về điều đó, có thể nhanh hơn chỉ cần nhân bản các thẻ / chi nhánh cụ thể như bạn nói :)
VeenarM

34

... 7 năm sau, trên sa mạc, một luồng gió thổi qua ...

Tôi không hài lòng với câu trả lời được chấp nhận vì vậy tôi đã tạo một số tập lệnh để thực hiện điều này cho bạn trên Github . Những thứ này sẽ giúp bất cứ ai muốn sử dụng git svn clonenhưng không muốn sao chép toàn bộ kho lưu trữ và không muốn tìm kiếm một bản sửa đổi cụ thể để sao chép từ giữa lịch sử (có thể bạn đang nhân bản một loạt các repos). Ở đây chúng ta chỉ có thể sao chép N phiên bản cuối cùng:

Sử dụng git svn cloneđể sao chép 50 phiên bản mới nhất

# -u    The SVN URL to clone
# -l    The limit of revisions
# -o    The output directory

./git-svn-cloneback.sh -u https://server/project/trunk -l 50 -o myproj --authors-file=svn-authors.txt

Tìm bản sửa đổi N trước đó từ một repo SVN

# -u    The SVN URL to clone
# -l    The limit of revisions

./svn-lookback.sh -u https://server/project/trunk -l 5     

Sẽ cho điều này một vết nứt, repo của chúng tôi có khoảng 170.000 bản sửa đổi và phải mất quá nhiều thời gian để thực hiện một dự án và tôi có hơn 10 dự án cụ thể trong repo để thực hiện: | Xem xét chỉ làm 3-4 năm lịch sử mà thôi.
VeenarM

1
Cảm ơn đã chia sẻ điều này!
Kai Mechel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.