tl; dr:
git svn
tạo ra những "@" - chi nhánh nếu chi nhánh (hoặc thẻ) được tạo ra cho một thư mục con (hoặc cho một thư mục mà không được theo dõi bởi git-svn). Sẽ luôn có một nhánh "thông thường" có cùng tên, nhưng không có hậu tố "@". "@" - chi nhánh chỉ tồn tại như một điểm phân nhánh cho nhánh thông thường.
Lưu ý: Tôi đã gửi bản vá cho việc này; phiên bản chỉnh sửa của lời giải thích này hiện là một phần của trang chính thức git svn
, như một phần mới "XỬ LÝ CÁC CHI NHÁNH SVN" (kể từ Git 1.8.1).
Trong Subversion, ngành và các thẻ chỉ là bản sao của một cây thư mục, vì vậy nó có thể (mặc dù thường nản chí) để tạo ra một chi nhánh từ một thư mục mà bản thân nó không một chi nhánh (hoặc thân) là. Ví dụ, bằng cách sao chép/trunk/foo vào/branch/bar, thay vì sao chép/trunk (một "thư mục con", để nói), hoặc bằng cách sao chép một thư mục nằm bên ngoài cấu trúc trunk/tags/branch (đó là có thể trong SVN).
Trong git, tuy nhiên, nhánh luôn dành cho toàn bộ repo, các thư mục con không tồn tại. git svn
do đó sử dụng giải pháp thay thế. Nếu nó phát hiện một chi nhánh đã được sao chép từ một thư mục không phải là chính nó được theo dõi như là một chi nhánh của git-svn, nó sẽ tạo ra một lịch sử mới. Ví dụ, đối với một chi nhánh thư mục con ở đâu/trunk/foo được sao chép vào/chi nhánh/bar trong r1234, nó sẽ tạo ra:
- Một git mới cam kết cho mỗi phiên bản SVN từ r1233 trên ngược (lưu ý số lượng là bản sửa đổi cuối cùng trước khi chi nhánh được tạo). Các cây của các cam kết này sẽ chỉ chứa thư mục con được phân nhánh. Vì vậy, đối với mỗi sửa đổi từ r1233 trở đi, thường sẽ có hai cam kết git, một với toàn bộ cây (được tạo ra khi git-svn xử lý lịch sử của
trunk
), và những cái mới.
- Chi nhánh giả gọi là "bar @ 1233" (tên chi nhánh @ bản sửa đổi), có sẵn cho cam kết được tạo từ r1233 ở trên.
- Cam kết từ r1234, cam kết đã tạo chi nhánh. Cam kết này sẽ có nhánh trên là tổ tiên (chỉ) của nó.
- Chi nhánh được gọi là "thanh", trỏ đến cam kết thứ hai.
Bằng cách đó, cho thanh chi nhánh thư mục con, bạn sẽ có hai chi nhánh tại git
- thanh @ 1233, đại diện cho nhà nước của các kho lưu trữ mà chi nhánh đã được tạo ra từ
- thanh, đại diện cho chi nhánh
Tôi không chắc chắn lý do tại sao nhánh giả này được tạo. Tôi nghĩ rằng nó được thực hiện để đại diện cho thông tin về việc sửa đổi chi nhánh được phân nhánh từ, và để có một lịch sử hoàn chỉnh cho chi nhánh.
Lưu ý rằng toàn bộ cơ chế này có thể được tắt bằng cách sử dụng cờ --no-follow-parent
. Trong trường hợp đó, mỗi nhánh SVN sẽ dẫn đến một nhánh git chỉ với các commit từ thư mục nhánh SVN. Mỗi nhánh sẽ không được kết nối với phần còn lại của lịch sử, và sẽ có cam kết gốc riêng của nó, tương ứng với cam kết đầu tiên trong nhánh.
Tôi có một thời gian thực sự khó khăn khi tìm kiếm tên này, nhưng có vẻ như các nhánh này được tạo từ các cam kết SVN đã được tìm thấy không được tham chiếu nữa bởi nhánh (hoặc thẻ) svn mà chúng được tạo ban đầu. Giống như các cam kết không được tham chiếu trong Git, ngoại trừ việc có thể khôi phục tên chi nhánh cho cam kết. – fork0
@ fork0: Cảm ơn bạn đã trả lời. Nhưng tôi không hiểu rõ ràng như thế nào cam kết không được tham chiếu có thể có mặt trong svn. Các tham chiếu có thể bị mất như thế nào? Bạn có thể chia sẻ suy nghĩ của bạn về điều này? – crankparty
Tôi không biết. Có lẽ người duy trì kho SVN không bao giờ làm sạch chúng (hoặc SVN không có khả năng nào cả?). Tôi không có ý nói rằng các tài liệu tham khảo đã bị mất, thay vào đó ai đó mới bắt đầu cam kết từ một điểm trước đó trong lịch sử – fork0