Làm cách nào để cập nhật repo trần của tôi?


Câu trả lời:


83

Nếu bạn muốn sao chép tất cả các đối tượng từ repo chính, hãy làm điều này bên trong repo chính:

git push --all <url-of-bare-repo>

Ngoài ra, thực hiện tìm nạp bên trong repo trần:

git fetch <url-of-main-repo>

Bạn không thể thực hiện việc kéo, bởi vì một lần kéo muốn hợp nhất với HEADđiều mà một repo trần không có.

Bạn có thể thêm chúng dưới dạng điều khiển từ xa để tiết kiệm cho mình một số thao tác gõ trong tương lai:

git remote add <whatever-name> <url-of-other-repo>

Sau đó, bạn có thể chỉ cần làm

git push --all <whatever-name>

hoặc là

git fetch <whatever-name>

tùy thuộc vào repo bạn đang ở đâu. Nếu <whatever-name>origin, bạn thậm chí có thể bỏ nó hoàn toàn.

Tuyên bố từ chối trách nhiệm: Tôi không phải là một guru guru. Nếu tôi nói điều gì đó sai, tôi muốn được giác ngộ!

Cập nhật: Đọc các bình luận!


7
Khi tôi thực hiện một git-fetch --allkho lưu trữ bên trong, tôi không thấy các bản cập nhật tôi đã thực hiện cho repo chính, nhưng khi đẩy chúng từ repo chính với git push --all <url-of-bare-repo>tôi thì tôi thấy các bản cập nhật git log. Có lẽ có một lời giải thích đơn giản cho điều này - ai đó có thể giải thích?
pho79

2
@Thomas - Vâng, bởi "không thấy" Ý tôi là git logkhông hiển thị những cập nhật này trong repo trần. (Không git log --all, và cũng không phải là một repo hoạt động được tạo bằng cách nhân bản repo trần - thông qua git log --allhoặc chỉ đơn giản là nhìn vào các tệp mới sẽ hiển thị ở đó). Đó là một thử nghiệm khá nhanh để xem cho chính mình. Chủ yếu tôi chỉ tò mò những gì tôi đang thiếu.
pho79

70
Nếu repo xa nhất của bạn là một cái gì đó như github, nơi bạn không có quyền truy cập, không thể chạy đẩy, v.v., bạn có thể thực hiện git fetch -q origin master:masterbên trong repo trần địa phương của mình. Điều này sẽ lấy các công cụ mới từ nhánh chính của github và cập nhật nhánh chính cục bộ của bạn lên nhánh đó.
Altreus

4
@Altreus Thật vậy, master:masternhững gì được yêu cầu để di chuyển TRƯỚC về phía trước của repo từ xa. Trong trường hợp của tôi vì một vấn đề, tôi không thể kết nối với repo trần của chúng tôi nữa vì git đã bị mất. Cho đến khi nó được giải quyết, tôi làm một đường hầm ngược và tìm đến repo trung tâm bằng cách sử dụng: git fetch ssh://localhost:8765/... master:mastervà nó hoạt động như một lá bùa. Cảm ơn!
estani

2
@Altreus Nếu bạn muốn tất cả các chi nhánh thì bạn có thể làmgit fetch origin *:*
JBert

71

Tôi đã tạo một kho lưu trữ bằng lệnh sau

git clone --bare <remote_repo>

Sau đó, tôi đã cố gắng cập nhật bản sao trần bằng câu trả lời của Thomas, nhưng nó không hoạt động với tôi. Để có được kho lưu trữ trần để cập nhật (đó là những gì tôi nghĩ Let_Me_Be đã yêu cầu), tôi đã phải tạo một kho lưu trữ nhân bản:

git clone --mirror <remote_repo>

Sau đó, tôi có thể chạy lệnh sau trong kho lưu trữ được nhân đôi để lấy các bản cập nhật của kho chính:

git fetch --all

Tôi đã xem qua giải pháp này bằng cách đọc Mirror a Git Rep Storage bằng cách kéo


22
Để thay đổi repo trần hiện có thành phản chiếu, tất cả những gì bạn cần làm là thêm 2 dòng vào tệp cấu hình git tại <REPO> .git / config. Trong [remote "origin"]phần, thêm fetch = +refs/*:refs/*mirror = true
Isaac Betesh

@IsaacBetesh Bạn đã cứu ngày của tôi :)
smc

54

Giải pháp duy nhất ngoài việc tái tạo với git clone --mirrortừ Gregor :

git config remote.origin.fetch 'refs/heads/*:refs/heads/*'

sau đó bạn có thể git fetchvà bạn sẽ thấy các bản cập nhật. Điều kỳ lạ là trước đây, mặc dù đã được remotecấu hình, nó không có các nhánh được liệt kê trong đó git branch -a.


1
Điều này thực sự giúp tôi ra ngoài! Dự án Capistrano / repo cũng sử dụng cài đặt này để cho phép một lớp lót git remote updatethực hiện công việc.
Minqi Pan

1
Nếu điều khiển từ xa có các nhánh được cập nhật hoặc bị xóa (và bạn muốn phản ánh những thay đổi đó), bạn có thể cần phải thêm --force--prunetương ứng vào git fetchdòng.
Elliott tàn sát

46

Giả định:

$ git clone --bare https://github.com/.../foo.git

Tìm nạp với:

$ git --git-dir=foo.git fetch origin +refs/heads/*:refs/heads/* --prune

Lưu ý: --git-dir=foo.gitkhông bắt buộc nếu bạn cdvào thư mục trước.


2
Mặc dù tôi không biết khi nào điều đó xảy ra, nếu originkhông được xác định, bạn luôn có thể thay thế originphần đó bằng đường dẫn / url vào kho lưu trữ ban đầu của bạn. ví dụ$ git --git-dir=foo.git fetch https://github.com/.../foo.git +refs/heads/*:refs/heads/*
antak

Điều này thật đúng với gì mà tôi đã tìm kiếm. Điều này làm việc hoàn hảo.
Maxime Rouiller

13

Sau nhiều lần lộn xộn, tôi thấy rằng điều này hiệu quả với tôi.

Một lần:

git clone --mirror ssh://git@source.address:2000/repo
git remote add remote_site ssh://git@remote_site.address/repo
git config remote.origin.fetch 'refs/heads/*:refs/heads/*'

Mọi lúc tôi muốn đồng bộ hóa:

cd /home/myhome/repo.git
git --bare fetch ssh://git@source.address:2000/repo
git  fetch ssh://git@source.address:2000/repo
git push --mirror remote_site

7
Dòng thứ ba ( git config remote.origin.fetch 'refs/heads/*:refs/heads/*') là chìa khóa. Câu trả lời tốt, cảm ơn!
peterh - Tái lập Monica

2
Như @peterh đã nói, dòng git config remote.origin.fetch 'refs/heads/*:refs/heads/*'này là câu trả lời. Sau khi nhấn lệnh này, tôi chỉ có thể git fetchvà repo đồng bộ với điều khiển từ xa.
đùa

3

Thêm kho lưu trữ trần như một kho lưu trữ từ xa, sau đó sử dụng git push.


Vì vậy, nếu tôi muốn làm điều này mà không cần đẩy, tôi không thể sử dụng một kho lưu trữ trần và sử dụng một liên kết tượng trưng hoặc một cái gì đó tương tự?
Šimon Tóth

Đẩy là phương pháp bình thường để chuyển nội dung kho lưu trữ sang một kho lưu trữ trần, không cần phải tránh nó.
Philipp

2
Bạn không thể luôn luôn đẩy. Ví dụ: nếu trần ở trong một mạng riêng và các repos chính là mạng công khai (trên GitHub, ví dụ)
fanf42

0

Đối với tôi sự kết hợp này đã làm việc:

git remote add remote_site https://github.com/project/repo.git
git fetch -u remote_site +refs/heads/:refs/heads/*
git push --mirror

-u tham số để tìm nạp là cần thiết, nếu không tôi nhận được thông báo lỗi: "Từ chối tìm nạp vào refs / Heads / master của kho lưu trữ không trống" (xem thêm https://stackoverflow.com/a/19205680/4807875 )

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.