2016-10-05 12 views
11

Tôi đang làm việc trên một số phần mềm phía máy chủ để thực hiện hợp nhất. Bằng cách sử dụng git worktree, bạn có thể kiểm tra một chi nhánh cụ thể cho một repo trần và hợp nhất một nhánh khác vào nó. Nó rất nhanh, ngay cả với các kho lưu trữ lớn.Git - Bare repo không thể có một worktree cho master branch - TẠI SAO?

Ngoại lệ duy nhất có vẻ là hợp nhất thành master. Khi tôi làm git worktree add /tmp/path/to/worktree master tôi nhận được một lỗi:

fatal: 'master' is already checked out at '/path/to/bare/repo'

Nhưng điều này rõ ràng là không đúng sự thật, git worktree list cho:

/path/to/bare/repo (bare)

... và dĩ nhiên, không có cây làm việc tại con đường đó, chỉ cần các tệp repo trần mà bạn mong đợi.

CẬP NHẬT: Tôi đã liên lạc với những người bảo trì git và họ đồng ý rằng đây có thể là lỗi. Tôi có một bản vá sơ bộ từ họ để kiểm tra. Ngoài ra, tôi cũng có thể tạo lại hành vi mong muốn mà không có bản vá.

Tại thời điểm này, tôi không hoàn toàn chắc chắn điều kiện biên hoặc nguyên nhân gốc là gì và có thể có sự sửa chữa sắp tới từ git.

+0

Từ việc đọc tài liệu, có vẻ như bạn có thể cần phải chuyển tùy chọn '-b' để tạo nhánh để làm việc này. –

+0

Hm. Nhưng có một nhánh chính hiện tại trong repo này. Thông báo lỗi dường như cũng xác nhận điều đó. Có lẽ nó không rõ ràng từ mô tả của tôi ở trên, nhưng cách tiếp cận này hoạt động tốt (không có thông báo lỗi) với các chi nhánh khác, bao gồm sáp nhập * từ * master đến chi nhánh khác. – mtutty

Trả lời

6

Hóa ra đây là lỗi trong git, bắt đầu với việc triển khai worktree ở 2,5 và cao hơn.

Kho lưu trữ trần vẫn có phản xạ HEAD. Bất cứ điều gì liên kết trỏ đến được xem xét bởi git (lên đến và bao gồm 2,10) là chi nhánh mặc định cho cloners mới, và (sai) được đối xử như thể nó đang hoạt động trên cây hoạt động.

Tôi đã nhận được bản vá từ những người bảo trì git để khắc phục hành vi này và có vẻ như nó hoạt động. Ngoài ra, nó có thể sử dụng update-ref trên repo trần để chuyển từ master tạm thời.

Tôi sẽ kiểm tra cả hai tùy chọn này.

3

Tôi nghĩ điều này không đúng. Bạn có thể muốn báo cáo cho họ. Tôi không thể tìm thấy bất kỳ cuộc thảo luận nào được nêu ra, mặc dù trường hợp này có vẻ hiển nhiên.

Giải pháp thay thế bạn có thể chạy git update-ref --no-deref HEAD 'HEAD^{commit}'. Nó sẽ gỡ bỏ HEAD hiện tại, để chủ nhân không được kiểm tra ra

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