2013-07-22 2 views
21

Có thể trong Git liệt kê tất cả các phiên bản trước của một dòng nhất định trong một tệp theo số dòng không?Liệt kê tất cả các phiên bản của một số dòng nhất định trong lịch sử GIT

Lý do tôi thấy hữu ích là có thể khắc phục sự cố dễ dàng hơn một vấn đề dựa trên báo cáo theo dõi ngăn xếp được ghi nhật ký.

tức là tôi có một số undefined method exception đăng nhập ở dòng 100 của một tệp nhất định. Các tập tin được bao gồm trong nhiều cam kết gây ra dòng nhất định có thể có 'đi' lên và xuống các tập tin ngay cả khi không có bất kỳ thay đổi được thực hiện cho nó.

Làm cách nào để in nội dung của dòng 100 của một tệp nhất định trên x lần commit cuối cùng?

+0

Xem thêm [lịch sử git của dòng nguồn] (http://stackoverflow.com/q/10854370) – CharlesB

+0

@MRT: Trong câu trả lời của tôi, tôi đã mô tả cách nhìn xa hơn thay đổi cuối cùng của một dòng. –

+1

Tôi đã đăng [answer] (http://stackoverflow.com/a/17803860/946850) mới cho câu hỏi trùng lặp. Sẽ giữ cùng một câu trả lời ở đây dưới dạng bản sao chỉ trong trường hợp câu hỏi này không bị đóng. – krlmlr

Trả lời

9

này sẽ gọi git blame cho mỗi sửa đổi có ý nghĩa để hiển thị dòng $LINE file $FILE:

git log --format=format:%H $FILE | xargs -L 1 git blame $FILE -L $LINE,$LINE 

Như thường lệ, đổ lỗi cho thấy số sửa đổi trong phần đầu của mỗi dòng. Bạn có thể thêm

| sort | uniq -c 

để nhận kết quả tổng hợp, giống như danh sách các cam kết đã thay đổi dòng này. (Không hoàn toàn, nếu mã chỉ được di chuyển xung quanh, điều này có thể hiển thị cùng một ID cam kết hai lần cho các nội dung khác nhau của dòng. Để có một phân tích chi tiết hơn, bạn phải thực hiện so sánh chậm trễ của các kết quả git blame cho các cam kết lân cận. ?)

+0

Cảm ơn, có vẻ như điều này đang thực hiện công việc. Chỉ cần sử dụng vốn 'L' trong các tùy chọn xargs:' git log - format = format:% H $ FILE | xargs -L1 git đổ lỗi $ FILE -L $ LINE, $ LINE' – mrt

+0

@MRT: Phải, chuyển '-l' thành' xargs' không được chấp nhận theo POSIX. Làm việc trên hệ thống của tôi, nhưng '-L' thì tốt hơn. – krlmlr

+0

Đối số '-L' đối với' git blame' có thể được sử dụng để tìm mã thay vì số dòng. Điều này có thể là ví dụ hữu ích cho việc tìm kiếm một hàm đã được di chuyển xung quanh (nhưng không phải khi nó được đổi tên). –

7

Nó không chính xác những gì bạn đang yêu cầu, nhưng với git blame <file> bạn có thể thấy cam kết sửa đổi lần cuối mỗi dòng.

Các cột đầu tiên cho thấy cam ID:

$ git blame my-file.txt 
65126918 (David Pärsson 2013-07-22 12:53:02 +0200 1) Heading 
c6e6d36d (David Pärsson 2013-07-22 12:53:10 +0200 2) ======= 
65126918 (David Pärsson 2013-07-22 12:53:02 +0200 3) 
13e293e3 (David Pärsson 2013-07-22 12:49:33 +0200 4) Text on first line 
8b3d2e15 (David Pärsson 2013-07-22 12:49:49 +0200 5) Text on second line 
13e293e3 (David Pärsson 2013-07-22 12:49:33 +0200 6) Text on third line 

Bạn có thể ghé ngoài sửa đổi cuối cùng bằng cách cung cấp một phiên bản, ví dụ

$ git blame 8b3d2e15 my-file.txt 

Bạn cũng có thể chọn dòng cụ thể với lập luận -L, như thế này:

$ git blame my-file.txt -L 4,+3 
13e293e3 (David Pärsson 2013-07-22 12:49:33 +0200 4) Text on first line 
8b3d2e15 (David Pärsson 2013-07-22 12:49:49 +0200 5) Text on second line 
13e293e3 (David Pärsson 2013-07-22 12:49:33 +0200 6) Text on third line 

Thông tin chi tiết và thủ thuật thông minh có thể được tìm thấy trên git-blame man page.

+1

Bạn cũng có thể chỉ định bản sửa đổi, tức là nó không chỉ về * last * cam kết mà chỉ sửa đổi từng dòng. –

+3

Đừng quên tùy chọn '-L100, + 10' để đổ lỗi cho 10 dòng từ dòng 100 hoặc' -L/void foo /, + 10' để đổ lỗi cho 10 dòng từ nơi hàm foo được xác định. – sehe

1

Tôi nghĩ rằng bạn đang theo dõi git blame, nó sẽ cho bạn biết cam kết đã thêm mỗi dòng.

Vì vậy, chạy git blame the-file-that-has-that-line.txt và chuyển đến dòng 100, nó sẽ cho bạn biết những gì cam kết đã thêm (và khi nó được cam kết và bởi ai).

-2

sử dụng git blame để đạt

xem nếu nó hoạt động

NAME 
     git-blame - Show what revision and author last modified each line of a file 

SYNOPSIS 
     git blame [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-e] [-p] [-w] [--incremental] [-L n,m] 
        [-S <revs-file>] [-M] [-C] [-C] [-C] [--since=<date>] [--abbrev=<n>] 
        [<rev> | --contents <file> | --reverse <rev>] [--] <file> 

DESCRIPTION 
     Annotates each line in the given file with information from the revision which last modified the line. Optionally, start annotating from the given revision. 
+0

Đã được đề xuất ba lần, không phải là những gì OP đang tìm kiếm ... – krlmlr

2

Có thực sự là một GUI ưa thích vận chuyển với Git mà làm cho nó dễ dàng để đi lại trong thời gian để xem làm thế nào một dòng cụ thể thay đổi . Hãy thử

git gui blame <file> 

Bạn có thể nhấp vào sửa đổi bên cạnh liên kết để "quay ngược thời gian".

3

Kiểm tra hướng dẫn ngắn này cũng như: http://zsoltfabok.com/blog/2012/02/git-blame-line-history/
Về cơ bản, nó sẽ hướng dẫn bạn thông qua một sự kết hợp của git blamegit show để xem những cam kết thay đổi một dòng cụ thể (git blame, như đã đề nghị đặc biệt trong câu trả lời David Parsson) và như thế nào thay đổi dòng đó (git show <commit-id>). Vì vậy, việc lặp lại trên các cam kết xen kẽ git blame <commit-id>git show <commit-id> sẽ cung cấp cho bạn toàn bộ lịch sử của một dòng cụ thể của một tệp.
Ngoài ra, đừng quên git blame -M trong trường hợp bạn nghi ngờ dòng đã được sao chép từ một tệp khác. Từ https://www.kernel.org/pub/software/scm/git/docs/git-blame.html

-M | num |
Phát hiện các dòng được di chuyển hoặc sao chép trong một tệp. Khi một cam kết di chuyển hoặc sao chép một khối các dòng (ví dụ tập tin gốc có A và sau đó B, và cam kết thay đổi nó thành B và sau đó A), thuật toán đổ lỗi truyền thống chỉ thông báo một nửa chuyển động và thường đổ lỗi cho các dòng di chuyển lên (tức là B) để cha mẹ và gán đổ lỗi cho các dòng đã được di chuyển xuống (tức là A) để cam kết con. Với tùy chọn này, cả hai nhóm các dòng được đổ lỗi cho cha mẹ bằng cách chạy thêm kiểm tra.

num là tùy chọn nhưng nó là giới hạn dưới của số ký tự chữ và số mà git phải phát hiện khi di chuyển/sao chép trong tệp để liên kết các dòng đó với commit gốc. Giá trị mặc định là 20.