Có an toàn khi sao chép nông với - ngày 1, tạo các cam kết và kéo cập nhật lại không?


280

Các --depth 1tùy chọn trong git clone:

Tạo một bản sao nông với một lịch sử được cắt ngắn theo số lần sửa đổi được chỉ định. Kho lưu trữ nông có một số hạn chế (bạn không thể sao chép hoặc tìm nạp từ nó, cũng không được đẩy từ đó vào), nhưng là đủ nếu bạn chỉ quan tâm đến lịch sử gần đây của một dự án lớn có lịch sử lâu dài và muốn gửi các bản sửa lỗi như các bản vá.

Nhưng tôi đã thực hiện thành công một bản sao nông, thực hiện một số thay đổi và đẩy những thay đổi đó trở lại nguồn gốc (bản sao trần).

Nó có ý nghĩa với tôi - ý tôi là tại sao không? khi tiêu đề nhân bản được xác định trong nguồn gốc và cam kết của tôi đứng đầu về điều này, dường như không có lý do. Nhưng hướng dẫn sử dụng nói khác.

Tôi thích ý tưởng về bản sao nông - ví dụ như lõi drupal: không có cách nào tôi cần biết điều gì đã xảy ra trong drupal 4 khi tôi bắt đầu từ 7. - nhưng tôi không muốn tự bắn vào chân mình.

Vì vậy, nó có an toàn để nhân bản nông, phát triển các cam kết trong đó, kéo lại để theo kịp với các cập nhật từ nguồn gốc?


13
Đây là một cuộc thảo luận tốt về độ sâu nhân bản
Andy

Vâng, tôi cũng đã đọc nó, cảm ơn Andy. các --orphankhái niệm có vẻ tương tự và tôi dự định sẽ có một vở kịch. Vẫn có chút lo ngại rằng các tài liệu không phù hợp với thực tế [vì ai nói tài liệu đó --orphanlà chính xác?!]
artfulrobot


1
Git 1.9 (Q1 2014) sẽ hỗ trợ đầy đủ nhân bản repo nông! Xem câu trả lời của tôi dưới đây
VonC

1
Git 2.5 (Q2 2015) hỗ trợ một cam kết tìm nạp! Tôi đã chỉnh sửa câu trả lời của mình, tham khảo " Kéo một cam kết cụ thể từ kho lưu trữ git từ xa ".
VonC

Câu trả lời:


304

Lưu ý rằng Git 1.9 / 2.0 (Q1 2014) đã loại bỏ giới hạn đó.
Xem cam kết 82fba2b , từ Nguyễn Thái Ngọc Duy ( pclouds) :

Bây giờ git hỗ trợ truyền dữ liệu từ hoặc đến một bản sao nông, những hạn chế này không còn đúng nữa.

Các tài liệu bây giờ đọc :

--depth <depth>::

Tạo một bản sao 'nông' với một lịch sử được cắt ngắn theo số lần sửa đổi được chỉ định.

Điều đó bắt nguồn từ các cam kết như 0d7d285 , f2c681cc29a7b8 hỗ trợ nhân bản, gửi gói / nhận gói với / từ các bản sao nông.
smart-http hiện cũng hỗ trợ tìm nạp / sao chép nông .

Tất cả các chi tiết đều nằm trong " shallow.c: 8 bước để chọn các cam kết mới cho.git/shallow ".

Cập nhật tháng 6 năm 2015: Git 2.5 thậm chí sẽ cho phép tìm nạp một cam kết duy nhất !
(Trường hợp nông cuối cùng)


Cập nhật tháng 1 năm 2016: Git 2.8 (Mach 2016) hiện tài liệu chính thức thực hành để có được một lịch sử tối thiểu.
Xem cam kết 99487cf , cam kết 9cfde9e (30 tháng 12 năm 2015), cam kết 9cfde9e (30 tháng 12 năm 2015), cam kết bac5874 (29 tháng 12 năm 2015) và cam kết 1de2e44 (28 tháng 12 năm 2015) của Stephen P. Smith (``) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết 7e3e80a , ngày 20 tháng 1 năm 2016)

Đây là " Documentation/user-manual.txt"

A <<def_shallow_clone,shallow clone>>được tạo bằng cách chỉ định công git-clone --depthtắc.
Độ sâu sau này có thể được thay đổi bằng công git-fetch --depthtắc hoặc toàn bộ lịch sử được khôi phục bằng --unshallow.

Hợp nhất bên trong một <<def_shallow_clone,shallow clone>>ý chí sẽ hoạt động miễn là một cơ sở hợp nhất có trong lịch sử gần đây.
Nếu không, nó sẽ giống như hợp nhất lịch sử không liên quan và có thể phải dẫn đến xung đột lớn.
Hạn chế này có thể làm cho một kho lưu trữ như vậy không phù hợp để được sử dụng trong quy trình làm việc dựa trên hợp nhất.

Cập nhật 2020:

  • git 2.11.1 tùy chọn được giới thiệu git fetch --shallow-exclude=để ngăn chặn tất cả lịch sử
  • git 2.11.1 tùy chọn được giới thiệu git fetch --shallow-since=để ngăn chặn tìm nạp các cam kết cũ.

Để biết thêm về quy trình cập nhật bản sao nông, hãy xem " Cách cập nhật bản sao nông git? ".


Theo nhận xét của Richard Michael :

để lịch sử chèn lấp: git pull --unshallow

Olle Härstedt thêm vào trong các ý kiến :

Để che lấp một phần của lịch sử : git fetch --depth=100.


3
Rất nhiều văn bản chỉ để nói " , miễn là phiên bản git của bạn không quá 4 tuổi và cơ sở hợp nhất có trong lịch sử gần đây"
Boris

3
@Boris câu trả lời này giúp tôi rất nhiều vì tôi đã nghi ngờ sử dụng bản sao nông. Trước đây đôi khi nó bị hỏng khi tôi thực hiện một cam kết và hợp nhất. Câu trả lời này là một lịch sử ngắn gọn, về lý do tại sao bây giờ nó hoạt động khi nó xảy ra, và làm thế nào để làm điều đó đúng.
Yana Agun Siswanto

6

Xem một số câu trả lời cho câu hỏi tương tự của tôi tại sao-cant-i-đẩy-từ-a-nông-clone và liên kết đến chủ đề gần đây trong danh sách git.

Cuối cùng, phép đo 'độ sâu' không nhất quán giữa các repos, bởi vì chúng đo từ các Head riêng lẻ của chúng, thay vì (a) Head của bạn, hoặc (b) các cam kết mà bạn đã nhân bản / tìm nạp hoặc (c) một cái gì đó khác bạn đã có trong tâm trí.

Một chút khó khăn là sử dụng Trường hợp sử dụng của một người (nghĩa là tự đồng nhất), do đó, phân phối và do đó có thể các repos khác nhau sẽ vẫn hoạt động vui vẻ với nhau.

Có vẻ như đây checkout --orphanlà giai đoạn 'thiết lập' đúng, nhưng vẫn thiếu sạch (nghĩa là một lệnh một dòng đơn giản dễ hiểu) trong bước "nhân bản". Thay vào đó, có vẻ như bạn phải initrepo, thiết lập một remotenhánh theo dõi (bạn chỉ muốn một nhánh duy nhất?), Và sau đó fetchlà nhánh duy nhất, cảm thấy dài dòng với nhiều cơ hội hơn cho những sai lầm.

Chỉnh sửa: Đối với bước 'nhân bản', hãy xem câu trả lời này


1
Xe tăng Philip. Tìm nạp một nhánh từ xa vẫn sẽ kéo theo toàn bộ lịch sử (AFAIK). Bạn nói đúng về độ sâu tương đối, thực sự tôi muốn một số điểm phù hợp trong lịch sử (như git merge-base 7.x 7.0 trong trường hợp của tôi)
artfulrobot

@artfulrobot: phương pháp '- định dạng' cho phép bạn tạo một 'bản sao' hẹp hẹp (nghĩa là một phân đoạn tập trung) và sau đó sử dụng nó như thể đó là một repo thích hợp. Đó là điều tôi chưa từng thử trong cơn giận nhưng đó là điều tôi cần sớm chứng minh.
Philip Oakley
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.