2016-07-12 18 views
5

Tôi đã tạo một tập lệnh đơn giản để di chuyển kho SVN khá lớn. Thay vì sử dụng git svn clone, tôi đang sử dụng git svn initgit svn fetch để tôi có thể chỉ định sửa đổi và tìm nạp nó theo từng đoạn. Nhiều hơn hoặc ít hơn, nó giống như thế này:Làm cách nào để tìm kiếm git-svn và giữ lại thư mục trống?

while [ "$CURRENT_REVISION" -lt "$MAX_REVISION" ]; do 
    END_REVISION=$((CURRENT_REVISION + 100)) 
    if [ "$END_REVISION" -ge "$MAX_REVISION" ] 
    then 
    END_REVISION=$MAX_REVISION 
    fi 

    git svn fetch -r "$CURRENT_REVISION":"$END_REVISION" --authors-file="$AUTHORS_FILE" 

    #increasing the current and end revision 
    CURRENT_REVISION=$END_REVISION 
    END_REVISION=$((CURRENT_REVISION + 100)) 
done 

Tuy nhiên, tôi hiểu rằng theo mặc định, hành vi tìm nạp/sao chép sẽ không giữ lại các thư mục trống. Vì vậy, tôi có thể cần phải tự kiểm tra trong những thư mục trống (* mà tôi đang cố gắng để tránh).

Có thông số --preserve-empty-dirs trong git svn clone nhưng không có trong git svn fetch.

Có cách nào khác để giải quyết vấn đề này không?

CẬP NHẬT

Mặc dù nó không được đề cập trong các tài liệu chính thức mà chúng ta có thể sử dụng phím cấu hình cho lấy, nó được thực sự hoạt động

Có giải thích chi tiết bởi @Vampire liên quan đến này câu hỏi. Vì vậy, tôi sẽ đơn giản hóa điều này.

Sau khi thực hiện các kho init, tôi đã phải thay đổi cấu hình của chi nhánh từ xa của tôi:

git config svn-remote.<remote name>.preserve-empty-dirs "true"

git config svn-remote.<remote name>.placeholder-filename ".gitkeep"

Bạn có thể kiểm tra cấu hình bằng cách nhìn vào /.git/config. Chỉ cần tìm nạp bình thường và thư mục của bạn sẽ được giữ nguyên.

+0

Bạn có sử dụng tính năng này cho chuyển đổi một lần hay bạn muốn sử dụng git-svn để sử dụng Git làm giao diện người dùng cho kho lưu trữ Subversion mà vẫn sẽ là nguồn chuẩn cho mã của bạn? – Vampire

+0

Có, tôi có thể nói đó là chuyển đổi một lần. – alfonzjanfrithz

Trả lời

3

git-svnkhông phải công cụ phù hợp cho chuyển đổi một lần của kho. Nó là một công cụ tuyệt vời nếu bạn muốn sử dụng Git làm giao diện người dùng cho máy chủ SVN hiện tại, nhưng đối với chuyển đổi một lần, bạn nên không sử dụng git-svn, nhưng svn2git phù hợp hơn cho trường hợp sử dụng này.

Có các công cụ pleny được gọi là svn2git, tốt nhất có thể là công cụ KDE từ https://github.com/svn-all-fast-export/svn2git. Tôi khuyên bạn nên sử dụng công cụ svn2git. Đó là điều tốt nhất tôi biết có sẵn ở đó và nó rất linh hoạt trong những gì bạn có thể làm với các tập tin quy tắc của nó.

Nếu bạn không 100% về lịch sử kho lưu trữ, svneverever từ http://blog.hartwork.org/?p=763 là công cụ tuyệt vời để điều tra lịch sử của kho lưu trữ SVN khi di chuyển nó sang Git.


Nếu bạn vẫn muốn sử dụng git svn, bạn không cần phải manally hunk fetching của bạn. Chỉ cần làm git svn clone ..., nếu bạn muốn tạm dừng, hãy hủy thực hiện và sau đó thực hiện git svn fetch để tiếp tục quá trình tìm nạp. Nó sẽ tự động tiếp tục ở nơi nó ngừng hoạt động và thậm chí xác nhận bản sửa đổi được tìm nạp lần cuối về việc nó đã được tải hoàn toàn hay cần phải được nạp lại.


Nếu bạn vẫn muốn tự hunk quyến rũ của bạn, hãy biết rằng git svn clone ... là chính xác giống như git svn init ... Tiếp theo git svn fetch, với ngoại lệ mà theo clone thông số cụ thể các thuộc tính cấu hình svn-remote.<remote name>.preserve-empty-dirs được thiết lập để truesvn-remote.<remote name>.placeholder-filename được đặt thành đối số bạn đã đặt trong khoảng từ initfetch. Vì vậy, chỉ cần làm điều đó bằng tay sau khi init của bạn và trước khi lấy của bạn và bạn là tốt.

Một lưu ý:preserve-empty-dirs afair chỉ cần thiết nếu bạn cần có những thư mục trống trong kho Git và bạn chỉ sử dụng kho lưu trữ Git sau đó. Miễn là bạn chỉ sử dụng git svn làm giao diện người dùng cho một kho lưu trữ SVN thoát, các thư mục emtpy sẽ tự động được tạo trong vùng làm việc của bạn và không cần phải là một phần của lịch sử kho lưu trữ thực. Những gì preserve-empty-dirs làm, là thêm một tập tin rỗng .gitignore (hoặc bất cứ điều gì bạn cấu hình với các tài sản tham số/cấu hình khác) để cam kết, để thư mục về cơ bản không còn trống nữa. Điều này được thực hiện để Git là một trình theo dõi nội dung, không phải là một trình theo dõi hệ thống tập tin. Nó theo dõi mã nguồn của bạn mà sẽ xảy ra để được lưu trữ trong các tập tin, không phải là các tập tin và thư mục riêng của mình. Đó cũng là lý do tại sao không có những điều như một hoạt động rõ ràng move hoặc copy trong Git, bởi vì di chuyển và bản sao được xác định trên bay khi cần thiết và muốn. Về mặt kỹ thuật, nó chỉ là removeadd cho move hoặc đơn giản add cho copy.

+0

Cảm ơn! Tôi sẽ đưa ra một bản cập nhật về giải pháp này. Về cơ bản tôi sẽ thêm 'svn-remote. .preserve-empty-dirs' trên cấu hình của tôi và tìm nạp lại repo. Quá tệ khi tài liệu chính thức không nói rõ ràng rằng 'bảo toàn-rỗng-dirs' có thể được thêm vào trong khóa cấu hình. Cảm ơn vì sự giác ngộ. Tôi cũng có thể thử giải pháp khác bằng cách kiểm tra tất cả chi nhánh hoạt động svn. có được một số lệnh để chạm vào một tập tin giả trong tất cả các thư mục rỗng, sao chép lại những dirs vào không gian làm việc git và tạo ra cam kết git mới cho điều đó. – alfonzjanfrithz

+0

Tôi nhận được lỗi này: 'svn-all-fast-export: /build/subversion-8E3yhQ/subversion-1.9.3/subversion/libsvn_subr/dirent_uri.c:972: svn_dirent_join: Assertion \' svn_dirent_is_canonical (base, pool) ' thất bại.' Quay lại 'git svn' :-( – peterh

+0

@peterh bạn phải có repo cục bộ. Xem tại đây: https://github.com/svn-all-fast-export/svn2git/issues/3 – Vampire

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