2009-04-14 6 views
289

Sự cốLàm thế nào để git-svn sao chép n bản sửa đổi cuối cùng từ một kho lưu trữ Subversion?

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

Lệnh git clone có thể nhận được các bản sửa đổi n mới nhất từ ​​kho lưu trữ Git nếu bạn sử dụng tùy chọn --depth, tức là bạn nhận được bản sao cạn của kho lưu trữ. Ví dụ:

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

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

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

Cho đến nay tôi đã chỉ tìm thấy tùy chọn -rN nơi N là phiên bản để kéo. Ví dụ:

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

Theo tài liệu có khả năng sử dụng -r$REVNUMBER:HEAD. Tôi đã thử những điều sau đây để có được 3 sửa đổi cuối cùng mà trả về một 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~3 với con số thực tế của ba nhưng cuối cùng phiên bản 534. Đó là làm việc, nhưng điều đó đòi hỏi tôi phải đầu tiên tìm ra các số phiên bản của ba nhưng cam kết cuối cùng.

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

Documentation

git-clone

git-svn

+1

những gì hiện '-s' làm gì ở đây? –

+5

Trả lời câu hỏi của riêng tôi: 's là dành cho --stdlayout mà giả sử bố cục được đề xuất svn cho thẻ, thân cây và các nhánh.' (nhưng không hoạt động đối với tôi) –

+0

Sẽ khó thực hiện như thế nào '- -depth' cho 'git svn', vì hỗ trợ đã có sẵn. Và nó đã có để tìm ra rev mới nhất từ ​​máy chủ? –

Trả lời

211

Bạn đã khám phá ra cách đơn giản nhất để xác định một bản sao cạn trong Git-SVN, bằng cách xác định số phiên bản SVN mà bạn muốn bắt đầu bản sao của bạn 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 được dựa trên con trỏ trong một đồ thị acyclic đạo (DAG), mà làm cho nó tầm thường nên đi ngược lại cam kết n. Nhưng trong SVN (và do đó trong Git-SVN) bạn sẽ phải tự tìm số bản sửa đổi.

+47

Vì vậy, ví dụ: git svn clone -s -r1450: HEAD http: // some/svn/repo. –

+5

nếu tôi muốn tiếp tục sao chép bản sửa đổi trước đó trong tương lai, có thể không? – Zennichimaro

+5

@Zennichimaro: Bạn có thể làm điều đó bằng cách thêm một từ xa 'git-svn' khác trỏ 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 cây cũ (một phần) thành nhánh bên phải. –

83

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

# 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à để làm một svn log nó và tìm ra một đầu tiên trên chi nhánh (người cuối cùng được liệt kê khi thực hiện):

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

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

+1

+1 từ tôi - đã giúp tôi nhận được một lỗi 128 vấn đề tôi đã có nhân bản toàn bộ svn repo –

+0

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

+1

Repos tôi làm việc có phân nhánh và bố trí 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 đó là 'cherry-pick' /' rebase' giữa chúng. Cam kết thực hiện thêm một bước ('push', sau đó 'dcommit' từ repo từ xa), nhưng tôi nghĩ nó đáng giá. – chronospoon

24

... 7 năm sau, trong sa mạc, một tumbleweed thổi bởi ...

tôi đã không hài lòng với câu trả lời chấp nhận vì vậy tôi tạo ra một số kịch bản để làm điều này cho bạn available on Github. Điều này sẽ giúp bất cứ ai muốn sử dụng git svn clone nhưng không muốn sao chép toàn bộ kho lưu trữ và không muốn tìm kiếm 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 bản ghi) . Ở đây chúng ta chỉ có thể sao chép các phiên bản N lần cuối:

Sử dụng git svn clone để clone 50 sửa đổi cuối cùng

# -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 việc 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  
+0

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à mất waaaay quá lâu để thực hiện một dự án duy nhất, và tôi có hơn 10 dự án cụ thể trong repo để làm: | Xem xét chỉ làm 3-4 năm lịch sử mà thôi. – VeenarM