Tại sao git log có thể không hiển thị lịch sử cho một tệp đã di chuyển và tôi có thể làm gì với nó?


89

Tôi đã đổi tên một vài tệp bằng cách sử dụng git mv, đã sử dụng git stash, đã xem nhanh HEAD (mà không cần thay đổi nó) sau đó đã làm lại git stash poptoàn bộ lô. Các bước di chuyển của tôi đã biến mất khỏi danh sách cam kết, vì vậy tôi đã làm lại chúng git rmvà thông báo cam kết tuyên bố git đã phát hiện ra tên đổi tên là đổi tên. Vì vậy, tôi không nghĩ đến nó nữa.

Nhưng bây giờ, sau khi cam kết, tôi không thể xem lịch sử của các tệp đã chuyển! Đây là những gì git nói về cam kết được đề cập:

~/projects% git log --summary
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date:   Wed Dec 8 22:37:54 2010 +0000

    Moved R_DebugUI into runtime

 delete mode 100644 test/R_DebugUI_iOS.h
 delete mode 100644 test/R_DebugUI_iOS.m
 create mode 100644 system/runtime/src/R_DebugUI_iOS.h
 create mode 100644 system/runtime/src/R_DebugUI_iOS.m

 <<snip older commits>>
 ~/projects%

Bây giờ tôi đang cố lấy lịch sử của một trong những tệp đã di chuyển này, vì vậy tôi có thể xem phiên bản cũ, nhưng tôi không nhận được bất kỳ thứ gì hữu ích:

~/projects/system/runtime/src% git log --follow --find-copies-harder -M -C R_DebugUI_iOS.m
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date:   Wed Dec 8 22:37:54 2010 +0000

    Moved R_DebugUI into runtime
~/projects/system/runtime/src% 

(Tôi cũng đã thử nó mà không có -M, -C--find-copies-harder, nhưng vô ích.)

Tôi có thể lấy lịch sử của nó dưới tên cũ của nó, dừng lại ở điểm nó bị xóa khỏi vị trí cũ:

~/projects% git log --summary --follow --find-copies-harder -M -C -- test/R_DebugUI_iOS.m
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date:   Wed Dec 8 22:37:54 2010 +0000

    Moved R_DebugUI into runtime

 delete mode 100644 test/R_DebugUI_iOS.m

commit 32a22d53c27e260714f759ecb3d3864e38b2e87f
Author: brone
Date:   Tue Dec 7 23:52:51 2010 +0000

    Can set debug UI's alpha.

<<snip older commits>>
~/projects%

Vì vậy, tôi không hoàn toàn bế tắc lần này, nhưng tôi sẽ không thích phải làm những việc như thế này mọi lúc. (Tôi dự đoán có một số lượng lớn tệp sẽ di chuyển ít nhất một lần trong đời.)

Tôi có làm điều gì sai? Hồ sơ bản cũ và bản mới giống nhau 98,8% (2 dòng trên tổng số 166 thay đổi). Sự hiểu biết của tôi là git sẽ có thể theo dõi tệp trong trường hợp này, bởi vì nó cho phép đổi tên các hoạt động thay vì lưu trữ chúng một cách rõ ràng và các tệp tương tự nhau đến mức tôi tin rằng nó nên coi chúng giống nhau.

Tôi có thể làm gì để sửa lỗi này không?


Đoán: Nó có hoạt động không nếu bạn thực hiện lệnh bên trong ~ / project / thay vì ~ / project / system / runtime / src?
Douglas

Không, tôi nhận được kết quả tương tự. (Nói chung git có vẻ khá tốt khi cho phép bạn ở trong bất kỳ thư mục nào ...)

Điều đó đã cho tôi một ý tưởng, và tôi đã cập nhật câu hỏi với những phát hiện của mình. Cảm ơn đã nhận xét!

tôi đang sử dụng "rùa biển 1.5.8.0" cùng với "1.7.3.1.msysgit.0" trên mswindows. Khi tôi đổi tên + cam kết một tệp trong explorer, tôi thấy trong gui "status = Rename". Tôi không biết đủ về git cách thực hiện điều này trong dòng lệnh để trả lời "làm thế nào để làm điều đó" nhưng rùa rùa đã làm điều gì đó cho tôi mà hoạt động như bạn mong đợi.
k3b

3
Đây có phải là một bản dupe không? stackoverflow.com/questions/2314652/…
cregox

Câu trả lời:



28

Tôi thấy tên của mình có git log -M --summary..


git log -M --summarykhông cung cấp bất kỳ thông tin đổi tên nào nếu bạn chỉ xem lịch sử của một số tệp nhất định, tức là với đối số tệp.
vinc17

17

Trả lời câu hỏi của chính tôi, vì tôi đã giải quyết được những lo lắng của mình, ngay cả khi tôi chưa giải quyết được chính xác vấn đề của mình. (Tuy nhiên, git log --followvẫn không hiệu quả với tôi.)

Đầu tiên, --summarynhật ký cho cam kết đổi tên bao gồm deletedòng có tên cũ của tệp. Vì vậy, nếu dễ dàng phát hiện, bạn có thể tìm thấy tên cũ của nó và git logtừ đó.

Nếu nó là một phần của một số cam kết lớn và do đó khó phát hiện hơn một chút - và tình huống này là một trong những lo lắng của tôi - git blame -Ccó thể được sử dụng với tên mới của tệp trong lần sửa đổi sau đổi tên đầu tiên. Có lẽ các dòng vẫn còn từ tệp gốc! - vì vậy git nên tìm nguồn của chúng và hiển thị tên tệp cũ (và một mã băm cam kết để có biện pháp tốt). Sau đó, bạn có thể chọn đường mòn với git log.

Vì vậy, nếu bạn quan tâm đến lịch sử của tệp như một đơn vị (vì bất kỳ lý do gì) thì có vẻ như nó có thể được thực hiện tương đối đơn giản. Mặc dù tôi có ấn tượng git muốn rằng bạn sử dụng nó đúng cách.


6
Tôi nghĩ rằng bạn cần tùy chọn -M để thực sự hiển thị lại tên chứ không phải xóa / add của
Adrian Cornish

1
Chỉ có cùng một vấn đề và nhận thấy rằng thư mục làm việc của bạn làm cho một sự khác biệt git log --follow .nơi thư mục làm việc là vị trí mới không làm việc, trong khi git log --follow path/to/new/dir, thực hiện từ một thư mục cha chung của người già và vị trí mới, công trình
akraf

1
Các --followthông số làm việc, nhưng bạn cần phải làm:git log --follow -- ./path/to/file
DrumM

Tôi vừa gặp sự cố git -log filename.csdừng khi cam kết di chuyển tệp (dir hiện tại được đặt thành thư mục của tệp). Tuy nhiên, cửa sổ lịch sử VS hiển thị toàn bộ nhật ký thay đổi tệp. Ngoài ra, tôi có thể thấy tệp đó đã được di chuyển bằng máy tính để bàn Github. Nhưng cũng git log -10 --follow filename.cshiển thị nhật ký trước khi di chuyển cam kết.
oleksa

10
git log --follow ./path/to/file

Tôi tin rằng đây là những gì bạn đang tìm kiếm.


3
Câu trả lời từ năm năm trước có thông tin này.
dotancohen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.