2012-05-22 30 views
10

Đầu tiên, bức tranh lớn: Tôi đang cố gắng viết một kịch bản nhận sau git cho một máy chủ Redmine/Gitolite mà tôi đang chạy. Theo các khuyến nghị khác nhau, tôi đang tạo một kho lưu trữ trống và cục bộ cho Redmine để đọc, và tôi đang thiết lập một kịch bản sau khi nhận trên Gitolite để đẩy các thay đổi vào repo Redmine.Git Fetch không hoạt động trên repo trần, nhưng git pull hoạt động trên repo bình thường

Tuy nhiên, tôi rất noobish với Git, vì vậy tôi thậm chí không thể làm một công việc đơn giản ở đây> _ <. Tôi nghĩ nếu tôi tìm ra điều này, tôi sẽ có thể viết kịch bản trên. Sau khi thiết lập repo thử nghiệm của tôi, tôi đã tạo ra hai repos như một thử nghiệm.

(The "Trung Repo" là một kho lưu trữ Gitolite tại git @ localhost: thử nghiệm)

cd /tmp 
mkdir /tmp/test 
$ git clone [email protected]:testing 
$ git clone [email protected]:testing testing2 
$ git clone [email protected]:testing --bare 

Bây giờ khi tôi chạy ls:

$ ls 
testing testing2 testing.git 

Bây giờ, tôi thay đổi các tập tin thử nghiệm bên trong test2, và sau đó đẩy các thay đổi vào repo trung tâm.

$ cd testing2 
$ echo 'testline' >> test && git commit --allow-empty-message -a -m '' && git push 

Như dự kiến, nếu tôi chạy "git pull" trên thư mục "test", mọi thứ hoạt động như mong đợi.

$ cd testing 
$ git pull 
remote: Counting objects: 5, done. 
remote: Total 3 (delta 0), reused 0 (delta 0) 
Unpacking objects: 100% (3/3), done. 
From localhost:testing 
    3242dba..a1ca5ba master  -> origin/master 
Updating 3242dba..a1ca5ba 
Fast-forward 
test | 1 + 
1 files changed, 1 insertions(+), 0 deletions(-) 
$ diff ./test ../testing2/test 
$ 

Như được hiển thị với thư mục "diff" khác, thư mục "test" và "testing2" hoạt động chính xác như mong đợi. Lệnh "git pull" đồng bộ hóa hai thư mục.

Tuy nhiên, nếu tôi cd vào testing.git (aka: repo trần), git fetch/git reset --soft không thể cập nhật repo trần lên phiên bản mới nhất.

$ ls 
branches config description HEAD hooks info objects packed-refs refs 
$ git fetch 
remote: Counting objects: 5, done. 
remote: Total 3 (delta 0), reused 0 (delta 0) 
Unpacking objects: 100% (3/3), done. 
From localhost:testing 
* branch   HEAD  -> FETCH_HEAD 
$ git reset --soft 
$ cd .. 
$ git clone ./testing.git testing3 
Cloning into testing3... 
done. 
$ cd testing3 
$ diff test ../testing2/test 
5a6 
> testline 

Như bạn có thể thấy từ ví dụ cuối cùng, kho lưu trữ trống không thể cập nhật và có sự khác biệt giữa hai tệp. Tôi đã làm gì sai?

Cảm ơn trước

Trả lời

25

bạn lấy đã không cập nhật các chi nhánh master, chỉ FETCH_HEAD (xem "What does FETCH_HEAD in Git mean?").

Như đã đề cập trong "how do I pull to a bare repository?", bạn nên làm một:

git fetch origin master:master 

Hoặc, cho all the branches:

git fetch origin +refs/heads/*:refs/heads/* 

Colin D Bennett thêm:

Nếu bạn muốn để tìm nạp chúng thường xuyên Asis, bạn nên xem xét:

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

mà sẽ cho phép bạn gõ git fetch để đồng bộ hóa các chi nhánh của bạn với điều khiển từ xa. Lưu ý rằng điều này chỉ có ý nghĩa trong một kho lưu trữ trống, nơi các chi nhánh địa phương không được phép chỉnh sửa.

+0

Cảm ơn. Rất nhiều vấn đề dường như bắt nguồn từ sự thiếu hiểu biết về phân nhánh của tôi ... vì vậy tôi chắc chắn sẽ đọc nó. – Dragontamer5788

+5

Nếu bạn muốn tìm nạp chúng một cách thường xuyên, bạn nên xem xét: '' git config remote.origin.fetch + refs/heads/*: refs/heads/* '', cho phép bạn gõ '' git fetch '' để đồng bộ hóa các nhánh của bạn với điều khiển từ xa. Lưu ý rằng điều này chỉ có ý nghĩa trong một kho lưu trữ trống, nơi các nhánh cục bộ không được sửa đổi. – vaab

+0

@ColinDBennet cảm ơn bạn đã chỉnh sửa :) – VonC

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