Tôi đang cố gắng duy trì một bản sao trống của kho lưu trữ Git và có một số vấn đề giữ cho các chi nhánh theo dõi từ xa luôn được cập nhật. Tôi tạo các chi nhánh theo dõi từ xa như sau:Làm thế nào để có được một chi nhánh theo dõi từ xa để luôn được cập nhật với nguồn gốc từ xa trong một kho Git trống?
git branch -t 0.1 origin/0.1
Điều này dường như làm những gì tôi cần làm cho thời điểm đó. Tuy nhiên, nếu tôi thực hiện các thay đổi cho origin
và sau đó tìm nạp với repo trần, mọi thứ bắt đầu sụp đổ. Luồng công việc của tôi trông giống như sau:
git fetch origin
Dường như tất cả các cam kết đều đến vào thời điểm đó, nhưng bản sao cục bộ 0,1 của tôi chưa được cập nhật. Tôi có thể thấy rằng những thay đổi đã được đưa vào kho lưu trữ bằng cách thực hiện như sau:
git diff 0.1 refs/remotes/origin/0.1
Tôi cần làm gì để cập nhật chi nhánh theo dõi cập nhật của từ xa? Tôi cảm thấy như tôi phải bỏ lỡ một bước hoặc một lá cờ ở đâu đó.
Cập nhật: Làm rõ bổ sung
Thông thường người ta sẽ đẩy vào một kho lưu trữ trần, chứ không phải chạy git fetch từ bên trong nó. Nếu bạn có thể sắp xếp để làm điều đó, cuộc sống sẽ dễ dàng hơn nhiều.
Dưới đây là một chút làm rõ về quy trình làm việc.
Kho lưu trữ git công khai của dự án được lưu trữ trên GitHub. Tôi đang quản lý dự án (wiki, các vấn đề, diễn đàn) bằng Redmine. Redmine yêu cầu một kho lưu trữ trần cục bộ để hoạt động. Khi GitHub nhận được thay đổi nó ping Redmine. Redmine sau đó cố gắng tìm nạp các thay đổi từ nguồn gốc của nó (GitHub).
Điều này rất hữu ích nếu tôi chỉ làm việc với tổng thể nhưng nó không hoạt động với các nhánh theo dõi của tôi. Các thay đổi đã được nhập nhưng không được liệt kê trong nhánh trong trình duyệt kho lưu trữ Redmine vì các nhánh địa phương không được cập nhật.
Tôi chắc chắn rằng tôi có thể đã làm việc này theo cách khác nhưng tìm một giải pháp chung để nhận các nhánh theo dõi và chạy chắc chắn là sở thích của tôi vì hầu hết các plugin liên quan đến Redmine đều cho rằng những thứ như "git fetch" nguồn gốc "là tất cả những gì cần phải làm.
Xem câu trả lời được chấp nhận cho giải pháp hoàn chỉnh. Giải pháp --mirror
có vẻ là chính xác những gì cần thiết trong trường hợp này.
'git merge' luôn đòi hỏi một cây làm việc, bạn phải sử dụng' git update-ref' thay vào đó trong một kho lưu trữ trống.Tôi nghĩ rằng bạn là chính xác mà một tấm gương có vẻ giống như một giải pháp tốt hơn. Nó có thể là giá trị thêm một không về 'git clone --mirror'. –
@Charles Bailey: lý do tôi nghĩ rằng nó có thể là một lỗi là trong nguồn của builtin-merge.c có một bình luận bắt đầu "Tại thời điểm này, chúng ta cần một hợp nhất thực sự ..." sau khi một nơi nhanh chuyển tiếp đã được thực hiện - Tôi không nghĩ rằng chỉ số hoặc cây làm việc là cần thiết cho đến thời điểm đó. Tôi sẽ loại bỏ nhận xét đó. –
Bạn có thể yêu cầu trên danh sách gửi thư git, nhưng tôi không tin rằng nó sẽ được coi là một lỗi. Tôi nghĩ rằng, nói chung, nó nhất quán hơn để có một sự phân biệt rõ ràng giữa các lệnh không đòi hỏi một cây làm việc và những người làm. Có một lệnh mà _might_ cần một cây làm việc là một giao diện phức tạp hơn có khả năng gây ra một số hiểu lầm. –