git cạn clone (clone --depth) nhớ cành xa


99

Sau khi sao chép một kho lưu trữ từ xa, nó không hiển thị bất kỳ tùy chọn nhánh nào từ xa bằng -a. Điều gì có thể là vấn đề? Làm thế nào để gỡ lỗi nó? Trong đoạn mã này, hai trong số các nhánh từ xa không được hiển thị:

$ git clone --depth 1 git://git.savannah.gnu.org/pythonwebkit.git
$ cd pythonwebkit
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
$ git --version
git version 1.8.3.1

Đã thử cùng một lệnh trên một máy khác, nó hoạt động tốt:

$ git clone --depth 1 git://git.savannah.gnu.org/pythonwebkit.git
Receiving objects: 100% (186886/186886), 818.91 MiB | 3.44 MiB/s, done.
$ cd pythonwebkit/
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/debian
  remotes/origin/master
  remotes/origin/python_codegen
$ git --version
git version 1.7.1

Cũng đã thử nhân bản một repo khác, nó hoạt động tốt. Mặc dù tôi có thể thử lại trên máy này, nhưng sẽ tốt hơn nếu biết điều gì sai.

Mọi đề xuất hoặc gợi ý sẽ được chào đón nhiều hơn.

Chỉnh sửa: Tóm tắt câu trả lời: Kể từ phiên bản git 1.8.3.2, "--depth" và "--no-single-branch" cần được sử dụng cùng nhau để có được hành vi giống như trước. Đây được coi là một bản sửa lỗi.


3
masterlà chi nhánh địa phương của bạn. remotes/origin/masterlà nhánh từ xa tương ứng. Câu hỏi chính xác là gì?
michas

1
Có lẽ bạn đã quên tính chi tiết? Hãy thửgit branch -avv
jthill

Đối với michas, vv: chúng tôi thường không gọi master là một nhánh, xin lỗi vì sự nhầm lẫn. đã thêm "hai nhánh từ xa không được hiển thị". To jthill: cảm ơn đã nhắc nhở, bạn chính xác.
minghua

1
Cảm ơn bạn đã giới thiệu git clone --depth=1 --no-single-branch, đây là thứ tôi cần trong hầu hết các trường hợp.
Alireza Mohamadi

Câu trả lời:


62

Hành vi là đúng, sau lần sửa đổi cuối cùng, nhánh chính (vì đây là HEAD của điều khiển từ xa chính) là nhánh từ xa duy nhất trong kho lưu trữ:

florianb$ git branch -a
        * master
          remotes/origin/HEAD -> origin/master
          remotes/origin/master

Bản sao đầy đủ cung cấp các nhánh (tất cả) mới:

florianb$ git branch -a
        * master
          remotes/origin/HEAD -> origin/master
          remotes/origin/debian
          remotes/origin/master
          remotes/origin/python_codegen

Nhân bản nông

Do mô tả nông trong tài liệu kỹ thuật, " git-clone --depth 20 repo[...] kết quả [các] chuỗi cam kết có độ dài tối đa là 20." Do đó, một bản sao nông nên chứa độ sâu cam kết được yêu cầu, từ đầu của một nhánh.

Như - ngoài - tài liệu của git clonecho --single-branch-option mô tả:

"Chỉ sao chép lịch sử dẫn đến đầu của một nhánh duy nhất, được chỉ định bởi --branchtùy chọn hoặc HEADđiểm của điều khiển từ xa của nhánh chính tại. Khi tạo một bản sao nông với --depthtùy chọn, đây là mặc định, trừ khi --no-single-branchđược cấp để tìm nạp các lịch sử gần mẹo của tất cả các nhánh. "

Do đó một nông bản sao ( với các độ sâu -option) chỉ lấy về chỉ một chi nhánh duy nhất (ở độ sâu yêu cầu của bạn).


Thật không may, cả hai tùy chọn ( --depth--single-branch) đã bị lỗi trong quá khứ và việc sử dụng các bản sao cạn gây ra các vấn đề chưa được giải quyết (như bạn có thể đọc trong liên kết tôi đã đăng ở trên), nguyên nhân là do quá trình viết lại lịch sử đã cho. Điều này nói chung dẫn đến hành vi hơi phức tạp trong những trường hợp đặc biệt.


1
florianb: phiên bản git của bạn là gì? Cám ơn vì đã thử nó. Tôi đã làm --depth 1 trên 1.7.1 bây giờ nó hiển thị tất cả các nhánh từ xa. đã cập nhật câu hỏi với cái này. +1 để xác minh sự cố.
minghua

1
@minghua: Tôi đang sử dụng 1.8.4 - tôi sẽ thực hiện một cuộc điều tra nhỏ nếu có bản vá về vấn đề đó.
Florian Neumann

1
@minghua: Tôi đã chỉnh sửa để phản ánh những phát hiện mới về "nhân bản cạn".
Florian Neumann

1
Nó gần như hoàn hảo ngoại trừ một điều duy nhất: câu nói "người chủ đại diện đã quyết định cắt bỏ những nhánh khác" có nghĩa là gì? Tôi nghĩ những nhánh đó vẫn còn đó.
minghua

2
--no-single-branch cũng sao chép tất cả các thẻ. Chúng ta có thể tránh điều đó bằng cách tạo một repo mới, sử dụng cùng một cấu hình để tìm nạp tất cả các điều khiển từ xa, tức là fetch = +refs/heads/*:refs/remotes/origin/*và đang chạy git fetch --depth 1(không có --tags). Chúng tôi cũng có thể thêm các thẻ cụ thể để tìm nạp, sử dụng cấu hình như fetch = +refs/tags/v2.0.0:refs/tags/v2.0.0.
Sam Watkins,

208

Sau khi thực hiện một bản sao cạn, để có thể kiểm tra các chi nhánh khác từ xa ,

  1. Run (cảm ơn @jthill):

    git remote set-branches origin '*'
    
  2. Sau đó, làm một git fetch -v

  3. Cuối cùng git checkout the-branch-i-ve-been-looking-for


Bước 1 cũng có thể được thực hiện thủ công bằng cách chỉnh sửa .git/config.

Ví dụ: thay đổi dòng folloing từ:

fetch = +refs/heads/master:refs/remotes/origin/master

to (thay thế masterbằng *):

fetch = +refs/heads/*:refs/remotes/origin/*

57
Bạn cũng có thể sử dụng git remote set-branches origin '*'cho tất cả các nhánh, thay thế *bằng tên nhánh cho một nhánh .
jthill

Cảm ơn bạn! Điều này đã cứu ngày của tôi.
Steven Xu

Nghĩa -vvvgit fetch -vvvgì? Tôi coundn't tìm thấy bất kỳ thông tin về nó trong git nạp doc
guo

@guo nó dành cho cấp verbosityhoặc debugghi nhật ký của git. Nó không phải là từ fetchphương pháp.
marlo

1
@ kawing-chiu, điều này rất hữu ích nếu bạn có rất nhiều chi nhánh và quy mô là lớn cho 'kết nối internet' trước đây và bây giờ có thể đủ khả năng để có được tất cả các chi nhánh đó. :)
marlo

62

Từ việc đọc các phản hồi và nhận xét từ @jthill, điều phù hợp nhất với tôi là sử dụng set-branchestùy chọn trên git remotelệnh:

$ git clone --depth 1 https://github.com/dogescript/dogescript.git
$ git remote set-branches origin 'remote_branch_name'
$ git fetch --depth 1 origin remote_branch_name
$ git checkout remote_branch_name

Điều này thay đổi danh sách các chi nhánh được theo dõi bởi điều khiển từ xa có tên để chúng tôi có thể tìm nạp và thanh toán chỉ chi nhánh được yêu cầu.


15
Tốt hơn là nên sử dụng git remote set-branches --add origin 'remote_branch_name'để nhánh mới bổ sung cho các nhánh hiện có, thay vì thay thế chúng trong danh sách các nhánh (hoặc các mẫu nhánh) của điều khiển từ xa để tìm nạp trong tệp .git / config.
câm

2
OMG, một câu trích dẫn duy nhất 'rất quan trọng tronggit remote set-branches --add origin 'remote_branch_name'
Cuối tuần

@Weekend Tôi không thể làm việc này cho đến khi tôi rời khỏi dấu nháy đơn ra
PandaWood

@PandaWood Có thể bạn đang sử dụng Windows. Dấu "$" trong câu trả lời ngụ ý Bash (trên Unix hoặc Cygwin / MSYS).
Yongwei Wu

Tôi không thấy bất cứ điều gì về các dấu ngoặc kép là cần thiết trong tài liệu và nó có vẻ hoạt động tốt mà không cần một dấu ngoặc kép nào trên macOS.
Nickolay
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.