2011-05-19 29 views
14

Một số tùy chọn trong git diff, ví dụ --name-status, làm cho đầu ra của một lá thư trạng thái bên cạnh tên tệp. Đó là:Trạng thái “ghép đôi bị hỏng” và “không xác định” có nghĩa là gì và khi nào chúng xuất hiện?

A, C, D, M, R, T, U, X, B

... và họ có nghĩa

gia tăng (A), sao chép (C), Đã xóa (D), Sửa đổi (M), Đổi tên (R), loại (tức là tập tin thông thường, liên kết tượng trưng, ​​submodule,…) đã thay đổi (T), Unmerged (U), Unknown (X), hoặc ghép nối Broken (B).

Câu hỏi: cách XB trạng thái nên được hiểu, và đó hoàn cảnh dẫn đến sự xuất hiện của họ? Bạn có thể cung cấp một loạt các bước dẫn đến các trạng thái như vậy xuất hiện ở đầu ra của git-diff và có thể là cách khắc phục chúng không?

Trả lời

12

Các B “vỡ cặp” tình trạng không bao giờ xuất hiện trực tiếp trong --name-status đầu ra, nó chỉ là hữu ích như là một cuộc tranh cãi đến tùy chọn --diff-filter khi cũng sử dụng tùy chọn -B (--break-rewrites). Sử dụng nó như một bộ lọc chọn các tập tin đã có ít nhất một tỷ lệ phần trăm nhất định của nội dung của họ bị xóa hoặc thay đổi.

Việc “bẻ gãy” này không hữu ích một cách khủng khiếp với --name-status vì điểm “phá vỡ” chủ yếu là thay đổi cách tạo văn bản khác: nó loại trừ dòng ngữ cảnh (dòng không thay đổi) khỏi đầu ra khác thay vì tạo thêm và loại bỏ các dòng sẽ được yêu cầu xung quanh bất kỳ "ngẫu nhiên" phổ biến sau đó thuật toán khác đã xảy ra để tìm.

git init broken-pairs 
cd broken-pairs 
nums() { seq "$1" "$2" 2>/dev/null || jot $(($2 - $1 + 1)) "$1"; } 
nums 0 99 > a 
nums 100 199 > b 
git add a b 
git commit -ma=0-99,b=100-199 
nums 200 299 > a 
{ nums 100 149; nums 350 399; } > b 
git diff --name-status --diff-filter=B    # selects nothing 
git diff --name-status --diff-filter=B -B   #   M100 a 
git diff --name-status --diff-filter=B -B/50  #   M100 a M050 b 

Các X tình trạng “không rõ” nên không bao giờ thực sự xuất hiện. Nếu nó xuất hiện, nó có nghĩa là một tên đường dẫn không bị unmerged, thêm vào, xóa, sửa đổi hoặc đã thay đổi kiểu của nó (có hiệu quả: không thay đổi) bất ngờ làm cho nó vào cốt lõi của máy móc khác biệt bên trong; lỗi feeding unmodified <pathname> to diffcore cũng sẽ được tạo.

Dường như nó còn sót lại từ một số chế độ hoạt động cũ.

+0

Cảm ơn câu trả lời chính xác và đầy đủ! –

+0

Trạng thái 'U' có thể được sử dụng để phát hiện các tệp xung đột trong quá trình hoạt động' git rebase'. Ví dụ: tôi có bí danh 'git conflicts' chạy' diff --name-only --diff-filter = U' để giúp xác định tệp có xung đột hợp nhất. – larsks

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