Git: Показать все изменения в одной строке в указанном файле по всей истории git

Я огляделся и не уверен, что это возможно, но здесь идет:

У меня есть (javascript) файл (скажем/lib/client.js), в котором у меня есть уникальный идентификатор, назначенный переменной, например:  var identifier = "SOME_IDENTIFIER";

Вы можете вспомнить идентификатор, такой как номер версии: Периодически мы будем менять эту переменную на новый идентификатор.

Мне бы хотелось найти все уникальные идентификаторы, которые мы когда-либо использовали. Как это сделать с помощью git?

Я предполагаю, что может быть способ поиска в истории git и распечатать строку, соответствующую "var identifier =". Я могу удалить этот список вручную.

В любом случае, я был бы признателен за понимание. Спасибо.

Ответ 1

Так как git 1.8.4, существует более прямой способ ответить на ваш вопрос.

Предполагая, что строка 110 является строкой, говорящей var identifier = "SOME_IDENTIFIER";, сделайте следующее:

git log -L110,110:/lib/client.js

Это приведет к возврату каждой фиксации, которая коснулась этой строки кода.

[Git Документация (см. параграф` -L "командной строки)]

Ответ 2

См. справочную страницу для git-log и gitdiffcore. Я считаю, что эта команда будет делать это, но это может быть не совсем правильно:

git log -G "var identifier =" file.js

РЕДАКТИРОВАТЬ: Здесь грубое начало для bash script, чтобы показать фактические строки. Это может быть больше того, что вы ищете.

for c in $(git log -G "something" --format=%H -- file.js); do
    git --no-pager grep -e "something" $c -- file.js
done

Он использует git log -G для поиска интересных коммитов, используя --format=%H для создания списка хэшей commit. Затем он повторяет каждую интересную фиксацию, запрашивая git grep, чтобы показать строки из этого файла фиксации и файла, которые содержат регулярное выражение, предваряемые хешем фиксации.


EDIT: Изменен для использования -G вместо -S, как предлагается в комментариях.

Ответ 3

Вы также можете сделать это с помощью gitk:

gitk file.js

В раскрывающемся списке "commit" выберите "добавление/удаление строки:", а в текстовом поле рядом с ним введите "var identifier =", и любые фиксации, которые добавляют или удаляют строки, содержащие эту строку, будут выделены.

Ответ 4

Если вы адаптируете @rob ответ немного, git log будет в основном делать это за вас, если вам нужно только визуальное сравнение:

git log -U0 -S "var identifier =" path/to/file

-U0 означает вывод в режиме исправления (-p) и показывает нулевые строки контекста вокруг патча.

Вы можете даже сделать это через ветки:

git log -U0 -S "var identifier =" branchname1 branchname2 -- path/to/file

Может быть способ подавить заголовок diff, но я не знаю об этом.

Ответ 5

В magit вы можете сделать это с помощью

l, =L

Затем он попросит вас создать файл и начать, завершать строки.