2012-04-02 30 views
7

Dường như có một số mâu thuẫn với các lệnh được cho phép khi bạn đang ở trong thư mục .git và thư mục nào không được phép. Ví dụTại sao một số lệnh git không được phép trong thư mục .git?

git symbolic-ref HEAD 

hoặc

git diff --staged 

cũng tốt.

Nhưng

git diff 

hoặc

git status 

sản xuất thông báo lỗi: fatal: This operation must be run in a work tree

Thậm chí đáng ngạc nhiên hơn: tạo một bí danh của một trong những lệnh không ở trên, như git st cho git statussau đó nó hoạt động!

Có giải thích hợp lý nào cho tất cả điều đó không? Và tại sao bí danh của lệnh thất bại đột nhiên hoạt động chỉ vì đó là bí danh ??

Trả lời

3

Có giải thích hợp lý. Các lệnh với đối số không thành công vì chúng yêu cầu cây làm việc và khi bạn ở trong kho .git không có cây làm việc, chỉ các tệp kho lưu trữ. Các lệnh khác với đối số thành công vì chúng không yêu cầu cây làm việc.

+0

Điểm tốt. Điều đó có vẻ là logic. Điều đó không giải thích được hành vi với bí danh mặc dù ... –

+0

Bí danh là gì? – GoZoner

+0

Như Dan Cruz nói dưới đây, một số bí danh có thể làm việc bên ngoài một kho lưu trữ nhưng điều đó không nên phụ thuộc vào và, thẳng thắn, âm thanh nguy hiểm. – GoZoner

1

Có một vài cam kết Git (git wrapper: allow setup_git_directory_gently() be called earlier, Call setup_git_directory() much earliergit --paginate: paginate external commands again) liên lạc về những gì đang diễn ra. Hành vi khác nhau đối với các lệnh và bí danh dựng sẵn dường như xuất phát từ các vấn đề trước đó, trong đó các lệnh nội trang cần có để nhận thông tin cấu hình Git trước đó, yêu cầu xác định thư mục Git và cây làm việc để đến cấu hình cụ thể.

Nếu bạn có nguồn Git cục bộ, bạn có thể thực hiện git log --grep='setup_git_directory_gently' để nhận danh sách các cam kết liên quan đến hành vi bạn đang nhận thấy.

Đối với lý do tại sao bí danh cư xử theo cách mà họ làm, Accept git aliases outside a git repository giải thích:

af05d67 (Luôn đặt * nongit_ok trong setup_git_directory_gently(), 2008/03/25) đã có một sự thay đổi từ các bản vá ban đầu nộp dẫn trong việc vô hiệu hóa bí danh bên ngoài kho lưu trữ git.

Nó chỉ ra rằng một số người đã sử dụng "alias.fubar = diff --color-words" trong $ HOME/.gitconfig để sử dụng khác biệt không phải chỉ mục (hoặc bất kỳ lệnh nào không cần git repository) bên ngoài git kho lưu trữ, và sự thay đổi này đã phá vỡ chúng, để điều này phục hồi sự hỗ trợ cho việc sử dụng như vậy.

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