2010-08-01 38 views
93

Tôi tạo ra một repo trần để xuất bản kho của tôi, nhưng tôi không thể tìm ra cách để cập nhật repo trần với trạng thái hiện tại của kho lưu trữ chính.Làm thế nào để cập nhật kho tiền của tôi?

+2

Xem câu trả lời này: http://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide/2964397#2964397 –

Trả lời

57

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

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

Ngoài ra, làm một lấy bên trong repo trần:

git fetch <url-of-main-repo> 

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

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

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

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

git push --all <whatever-name> 

hoặc

git fetch <whatever-name> 

tùy thuộc vào những gì repo bạn đang ở. Nếu <whatever-name>origin, bạn thậm chí có thể để nó ra khỏi màn hình r.

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

Cập nhật: Đọc nhận xét!

+0

Đẩy dường như làm việc tốt, thx cho gợi ý tôi nghĩ rằng tôi sẽ có thể tích hợp này vào một cái móc hay cái gì đó tương tự. –

+4

Khi tôi đã thực hiện 'git-fetch --all' bên trong kho trống, tôi không thấy các cập nhật mà 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 'Tôi thấy các cập nhật trong' 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

+0

Ý bạn là gì bởi "không thấy"? Tôi không chắc làm thế nào 'git log' hoạt động trong một repo trần; có thể thử 'git log --all'? – Thomas

3

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

+0

Vì vậy, nếu tôi muốn thực hiện việc này mà không cần thúc đẩy thì tôi không thể sử dụng một kho chứa trần và sử dụng một liên kết tượng trưng hoặc một cái gì đó như thế? –

+0

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

+0

Bạn không thể lúc nào cũng đẩy. Ví dụ, nếu trần là trong một mạng riêng, và repos chính là một công cộng (trên GitHub, cho exemple) – fanf42

53

Tôi tạo ra một kho lưu trữ bằng cách sử dụng lệnh sau

git clone --bare <remote_repo>

Sau đó, tôi đã cố gắng để cập nhật các bản sao trần bằng cách sử dụng câu trả lời của Thomas, nhưng nó đã không làm việc cho tôi. Để có được kho trần để cập nhật (đó là những gì tôi nghĩ Let_Me_Be được hỏi), tôi đã phải tạo ra một kho lưu trữ gương:

git clone --mirror <remote_repo> 

Sau đó, tôi có thể chạy lệnh sau trong kho được nhân đôi để lấy thông tin cập nhật kho chính của :

git fetch --all 

tôi đã xem qua giải pháp này bằng cách đọc Mirror a Git Repository By Pulling

+11

Để thay đổi một repo trần hiện tại để 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 tin cấu hình git tại .git/config. Trong phần '[remote" origin "]', thêm 'fetch = + refs/*: refs/*' và 'mirror = true' –

31

giải pháp duy nhất bên cạnh tái tạo với git clone --mirrorfrom Gregor:

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

thì bạn có thể git fetch và bạn sẽ thấy các cập nhật. Điều kỳ lạ là trước khi điều này, mặc dù có một cấu hình remote, nó không có chi nhánh nào được liệt kê trong git branch -a.

+1

Điều này thực sự đã giúp tô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 update' thực hiện công việc. –

+0

Nếu điều khiển từ xa có các nhánh được nâng cấp hoặc bị xóa (và bạn muốn phản ánh những thay đổi đó), bạn có thể cần thêm '--force' và' --prune' tương ứng vào dòng 'git fetch'. –

4

Sau nhiều lần rối tung xung quanh, tôi thấy rằng điều này phù hợp với tôi.

Khi:

git clone --mirror ssh://[email protected]:2000/repo 
git remote add remote_site ssh://[email protected]_site.address/repo 
git config remote.origin.fetch 'refs/heads/*:refs/heads/*' 

Mỗi lần tôi muốn đồng bộ hóa:

cd /home/myhome/repo.git 
git --bare fetch ssh://[email protected]:2000/repo 
git fetch ssh://[email protected]:2000/repo 
git push --mirror remote_site 
+1

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

26

Giả sử:

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

Fetch với:

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

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

+2

Lạ lùng là câu trả lời này không nằm trên đầu trang. Ít nhất nó hoạt động ở đây ... –

+0

Tôi đã làm một bản sao trần, và không có nguồn gốc ... – Kieveli

+2

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

Các vấn đề liên quan