Làm cách nào để "hoàn tác" một bản sao - nhánh đơn?


102

Tôi sao chép một repo bằng cách sử dụng

git clone -b <branch name> --single-branch <github url> <target directory>

Cái này chỉ nhân bản nhánh này thôi, nhưng bây giờ mình muốn chuyển sang nhánh chính và các nhánh khác. Có cách nào ngoài việc xóa nó ra và bắt đầu lại sao chép phần còn lại của repo mà tôi có thể hoàn tác tùy chọn - một nhánh không?

Câu trả lời:


147

Bạn có thể yêu cầu Git kéo tất cả các nhánh như thế này:

git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
git fetch origin

Nếu bạn nhìn vào .git/config, nó sẽ giống như sau:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = false
[remote "origin"]
    url = https://github.com/owner/repo.git
    fetch = +refs/heads/master:refs/remotes/origin/master
[branch "master"]
    remote = origin
    merge = refs/heads/master
    rebase = true

Tôi so sánh điều này với một bản sao đầy đủ và thấy rằng sự khác biệt duy nhất là "tìm nạp" bên dưới [remote "origin"].

Lưu ý: Tôi đang chạy phiên bản Git 1.8.2. Các tùy chọn cấu hình có thể đã thay đổi nếu bạn đang chạy phiên bản Git cũ hơn. Nếu các lệnh của tôi không hoạt động, thì tôi khuyên bạn nên xem qua .git/configđể xem liệu bạn có thể thấy điều gì đó tương tự không.


2
Tôi chỉ muốn gửi cho bạn một lời cảm ơn đặc biệt vì tôi đã đọc rất nhiều và đọc trên googling và không thể tìm thấy bất cứ điều gì như thế này.
danieltalsky

2
Rất vui được giúp đỡ. Công gitcụ dòng lệnh cực kỳ mạnh mẽ (trên thực tế, hầu hết các lệnh được triển khai dưới dạng các lệnh khác), vì vậy bạn có thể thực hiện rất nhiều thứ với nó khi bạn hiểu cách bố trí kho lưu trữ (về cơ bản cách .gitthư mục hoạt động ).
sarahhodne

Điều này không hiệu quả với tôi - sau khi chạy các lệnh này git show-ref tagsvẫn không thành công.
felixfbecker 22/1017

1
Lưu ý rằng giải pháp này cũng sẽ làm việc nếu một chi nhánh đã cạn nhân bản bằng cách sử dụng cú pháp sau là tốt, mà trải qua những thiếu sót tương tự mô tả bởi OP:git clone --depth=1 --branch branchname git@github.com:foobar/repo.git destinationpath
danemacmillan

1
Wow, điều này còn xa mới trực quan! Thật kỳ lạ khi Git không dễ dàng có lệnh để thực hiện điều này. Vâng, tôi đã làm cho nó hoạt động ... và bây giờ tôi biết về tệp cấu hình trong thư mục .git của anh ấy!
kashiraja

60

Nếu bạn muốn thêm một nhánh duy nhất, bạn có thể làm như sau:

git remote set-branches --add origin [remote-branch]
git fetch origin [remote-branch]:[local-branch]

Hoạt động với git phiên bản 1.9.1


1
Tôi đang trong tình yêu với bạn
user1760150

4
Điều này thêm nhiều fetch =dòng vào .git / config, rất tiện lợi khi bạn muốn chuyển đổi giữa hai nhánh trên điều khiển từ xa nhưng không tìm nạp toàn bộ các nhánh khác. Cảm ơn!
Terry Brown

4

Để thêm một nhánh từ xa khác vào kho lưu trữ cục bộ của tôi đã được sao chép bằng cách sử dụng --single-branch, các cách sau phù hợp với tôi:

git remote set-branches --add origin [remote-branch]
git fetch
git checkout [remote-branch]

Bạn cũng có thể sử dụng các ký tự đại diện cho [remote-branch], ví dụ:

git remote set-branches --add origin release-1.*
git fetch
git checkout release-1.5

Điều này hoạt động bằng cách sử dụng git phiên bản 2.21.1 . Các câu trả lời khác gợi ý làm git fetch origin [remote-branch]:[local-branch]không hoạt động vì nó tạo ra nhánh cục bộ ở trạng thái chưa được kiểm soát. Khi chạy git pullnó lần đầu tiên cố gắng hợp nhất tất cả các cam kết của chi nhánh từ xa với chi nhánh cục bộ của tôi một lần nữa.


2
lần thứ hai tôi quay lại câu trả lời này. rất hữu ích. cảm ơn!
godbout

1
Câu trả lời hữu ích nhất
Denis Itskovich

1
lần thứ ba lol.
godbout

Có vẻ như chúng ta có cùng một chu kỳ phát hành :)
Arno Fiva

1

Chỉ cần thêm repo gốc làm điều khiển từ xa mới và làm việc ở đó?

git remote add path/to/myrepo myNewOrigin
git fetch myNewOrigin

Bạn thậm chí có thể xóa từ xa 'origin' hiện tại của mình và đổi tên 'myNewOrigin' thành 'origin' nếu bạn muốn.

Từ đó bạn có thể pull / merge / rebase.


0

Chỉ cần thay đổi .git/configtệp của đại diện cục bộ của bạn, dòng fetchcủa [remote origin] section.

Trước một cái gì đó như thế này

[remote "origin"]
    url = https://github.com/owner/repo.git
    fetch = +refs/heads/master:refs/remotes/origin/master

Sau khi nó sẽ như vậy

[remote "origin"]
    url = https://github.com/owner/repo.git
    fetch = +refs/heads/*:refs/remotes/origin/*

0

Ban đầu tôi đã áp dụng câu trả lời của Dominik Pawlak và nó đã hoạt động. Nhưng tôi không thể thực hiện thêm bất kỳ thay đổi nào sau khi tôi cam kết thêm mã vào chi nhánh mới của mình.

Có một cách khác để đặt lại single-branchhoàn toàn, chưa được đề cập ở đây:

git remote remove origin
git remote add origin git@gitlab.com:{yourProject}/{yourRepo}.git
git branch --set-upstream-to=origin/{yourBranch}  {yourBranch}
git pull

Điều này đặt lại mọi thứ về bản gốc.


0

Đối với tôi đã làm việc:

git remote remove origin
git remote add origin https://*<yourPath>*.git
git fetch
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.