2013-01-07 37 views
16

Sau nhiều lần tìm kiếm, tôi không tìm thấy phương pháp thỏa đáng dễ sử dụng để xem toàn bộ lịch sử của tệp được di chuyển trong Git và quan trọng hơn trong Gitk. Sử dụng "git log --follow [filePath]" và thậm chí "gitk --follow [filePath]" cung cấp cho bạn các cam kết mà tệp đã được tham gia nhưng sẽ không hiển thị cho bạn lịch sử thay đổi thực sự của tệp trước khi di chuyển. Do đó, tôi đã đưa ra một giải pháp khắc phục thô lỗ nhưng đơn giản.Sử dụng gitk để xem toàn bộ lịch sử của một tệp đã di chuyển

  1. Thực hiện gitk trên tệp đã được di chuyển: “gitk [newFilePath]”. Sao chép ID SHA1 của cam kết đầu tiên, đây phải là cam kết nơi tệp đã được di chuyển.
  2. Thực hiện gitk trên ID SHA1 được sao chép: “gitk [SHA1ID]”. Cam kết mới nhất nên là khi di chuyển đã xảy ra. Tìm tệp đã di chuyển và sao chép đường dẫn cũ.
  3. Thực hiện gitk trên ID SHA1 chúng tôi chỉ cần sao chép và đường dẫn tập tin cũ: “gitk [SHA1ID] - [oldFilePath]”

Quá trình này sẽ cho phép bạn xem lịch sử của tập tin trước di chuyển. Nếu đã có nhiều bước di chuyển, quá trình trên có thể được lặp lại.

Nếu có giải pháp nào tốt hơn cho vấn đề này, đặc biệt nếu có cách kết hợp các bước này để hiển thị toàn bộ lịch sử với các bước di chuyển, nó sẽ được đánh giá cao.

Trả lời

7

Nếu bạn muốn nhìn thấy những thay đổi đã được thực hiện trong từng cam kết ngay cả những tập tin đã được đổi tên, bạn có thể sử dụng tùy chọn -p của git log:

git log -p --follow [file/with/path] 
+0

Đây là giải pháp tuyệt vời! Tôi không thấy giải pháp của người khác sử dụng chuyển đổi -p với "git log --follow" trước đây.Nó sẽ được ưa thích để xem nó trong gitk nhưng tôi chắc chắn sẽ sử dụng phương pháp này! –

+0

Nếu bạn (vẫn đang) tìm cách GUI để thực hiện việc này - hãy thử SourceTree (liên kết trong câu trả lời của tôi) – Chris

3

Dưới đây là một chức năng bash đó sẽ hiển thị cho bạn lịch sử của một tập tin (sử dụng gitk) trong tất cả các hiện thân của nó ... tôi sẽ để lại nó như một bài tập cho người đọc nếu họ cần nó cho vỏ khác:

# bash 
gitk_follow() { 
    while (("$#")); do 
    git log --oneline --name-status --follow $1; 
    shift; 
    done | perl -ne 'if(s{^(?:[ACDMRTUXB]|R\d+)\s+}{}) { s{\s+}{\n}g; print; }' | sort -u 
} 

# used as: 
gitk $(gitk_follow some_file) 

Cập nhật:

Đã thay đổi để sử dụng perl vì tôi không chú ý đủ đến đầu ra từ bản ghi git trong phiên bản trước.

+0

Rất tốt, cảm ơn! Tôi đã phải sử dụng nó với một '--', mặc dù:' gitk - $ (gitk_follow some_file) '. –

0

Một cách khác là sử dụng ứng dụng SourceTree (GUI) do Atlassian phát triển. Bên trong ứng dụng, bạn có thể nhấp chuột phải vào tệp và chọn "Nhật ký đã chọn ..."

Log Selected.

Trong cửa sổ pop-up sau đó nó cho phép bạn "Follow đổi tên file":

enter image description here

tôi cũng sử dụng GitHub for Mac, nhưng không thấy rằng loại chức năng trong đó, nêu ra.

(Tôi không liên kết với một trong hai trong số họ!)

+0

không có bất kỳ biến thể Linux nào có sẵn cho điều này? –

0

Một chức năng đơn giản bằng các tùy chọn git log khác nhau và awk chính xác vào tên tập tin (và "-" gitk rằng cần được bao gồm):

# bash 
gitk_follow() { 
    while (("$#")); do 
    git log --pretty="" --name-status --follow $1; 
    shift; 
    done | awk '{print $NF}' | sort -u 
} 

# used as: 
gitk -- $(gitk_follow some_file)