Использование gitk для просмотра полной истории перемещенного файла

После долгих поисков я не нашел удовлетворительного метода, который легко использовать для просмотра полной истории перемещенного файла в Git и, что более важно, в Gitk. Использование git log --follow [filePath] и даже gitk --follow [filePath] дает вам коммиты, в которых участвовал файл, но не покажет вам фактическую историю изменений файла до перемещения. Таким образом, я придумал грубое, но простое обходное решение.

  1. Сделайте gitk для перемещенного файла: gitk [newFilePath]. Скопируйте идентификатор SHA1 первого коммита, это должен быть коммит, в который был перемещен файл.
  2. Выполните gitk для скопированного идентификатора SHA1: gitk [SHA1ID]. Последняя фиксация должна быть сделана, когда произошло перемещение. Найдите перемещенный файл и скопируйте старый путь.
  3. Сделайте gitk для идентификатора SHA1, который мы только что скопировали, и старого пути к файлу: gitk [SHA1ID] -- [oldFilePath]

Этот процесс позволит вам просмотреть историю файла перед перемещением. Если ходов было несколько, описанный выше процесс можно повторить.

Если есть какие-либо лучшие решения этой проблемы, особенно если есть способ объединить эти шаги для отображения полной истории с ходами, мы будем очень признательны.


person Kiren Padayachee    schedule 07.01.2013    source источник


Ответы (4)


Если вы хотите увидеть изменения, которые были сделаны в каждом коммите, даже если файл был переименован, вы можете использовать опцию -p из git log:

git log -p --follow [file/with/path]
person William Seiti Mizuta    schedule 10.01.2013
comment
Это отличное решение! Я не видел, чтобы чье-либо решение использовало переключатель -p с git log --follow раньше. Было бы предпочтительнее увидеть это в gitk, но я обязательно воспользуюсь этим методом! - person Kiren Padayachee; 12.01.2013
comment
Если вы (все еще) ищете способ сделать это с графическим интерфейсом - попробуйте SourceTree (ссылка в моем ответе) - person Chris; 13.03.2015
comment
Кажется, это не работает с gitk? Я получаю те же результаты с gitk -p --follow [file/with/path], что и с gitk --follow [file/with/path] - person user32882; 31.05.2020

Вот функция bash, которая должна показать вам историю файла (с использованием gitk) во всех его воплощениях... Я оставлю это в качестве упражнения читателю, если оно понадобится для другой оболочки:

# 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)

обновлено:

Перешел на использование perl, потому что в последней версии я не уделял должного внимания выводу журнала git.

person Brian Vandenberg    schedule 01.08.2014
comment
Очень мило спасибо! Однако мне пришлось использовать его с --: gitk -- $(gitk_follow some_file). - person das-g; 15.01.2016

Более простая функция, использующая различные параметры журнала git и awk для точного определения имен файлов (и «--», который нужен gitk, включен):

# 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)
person Thunder422    schedule 22.05.2016
comment
Два предложения, измените первую строку на: #!/usr/bin/env bash. И последняя строка должна принимать параметр командной строки: gitk -- $(gitk_follow $1) - person Wink Saville; 08.11.2019

Другой альтернативой является использование приложения SourceTree (GUI), разработанного Atlassian. Внутри приложения вы можете щелкнуть правой кнопкой мыши по файлу и выбрать «Журнал выбранных…».

Журнал выбран.

Во всплывающем окне он позволяет вам «Следовать за переименованными файлами»:

введите здесь описание изображения

Я также использую GitHub для Mac, но пока не видел там такой функциональности.

(Я не связан ни с одним из них!)

person Chris    schedule 13.03.2015
comment
нет ли доступного варианта Linux для этого? - person Osama F Elias; 14.06.2017