Как я могу перечислить все разные версии файла, а также их различия? - PullRequest
21 голосов
/ 26 декабря 2009

используя git, я хочу перечислить все различные ревизии данного файла.

Затем я хочу выбрать конкретную версию и сравнить ее при другой.

Как я могу это сделать?

Ответы [ 4 ]

24 голосов
/ 26 декабря 2009

Чтобы показать историю изменений определенного файла, вы можете использовать git log:

git log -p -- path/to/file

-p говорит ему показать разницу между каждой ревизией и ее родителем. Чтобы получить кумулятивную разницу между двумя ревизиями, возьмите ID двух ревизий и передайте их git diff:

git diff abc123 def456 -- path/to/file.

Где abc123 и def456 - идентификаторы редакции.

13 голосов
/ 29 сентября 2015

Вы можете использовать такой скрипт, чтобы записать все версии файла в отдельный файл:

, например

git_dump_all_versions_of_a_file.sh path/to/somefile.txt

Он сгенерирует группу файлов в той же папке, что и исходный файл, названный так, как показано ниже, с последним изменением, дополненным «1». Обратите внимание, что он также будет выгружать другой файл, заканчивающийся на .logmsg, который также содержит сообщение журнала коммита.

path/to/somefile.txt.1.0dea419
path/to/somefile.txt.1.0dea419.logmsg
path/to/somefile.txt.2.cdea8s9
path/to/somefile.txt.2.cdea8s9.logmsg
path/to/somefile.txt.3.fdsf2d
path/to/somefile.txt.3.fdsf2d.logmsg
etc...

После того, как я сбросил все файлы, я просто запускаю grep -r DELETED_METHOD_NAME somefile.txt.*, чтобы найти то, что я ищу.

git_dump_all_versions_of_a_file.sh

function show_help()
{
  echo "dump all git versions of a file to separate files"
  echo 
  echo "usage: FILENAME";
  echo 
  echo "e.g."
  echo 
  echo "$ git_dump_all_versions_of_a_file.sh path/to/somefile.txt"
  echo 
  echo "path/to/somefile.txt.1.0dea419"
  echo "path/to/somefile.txt.1.0dea419.logmsg"
  echo "path/to/somefile.txt.2.cdea8s9"
  echo "path/to/somefile.txt.2.cdea8s9.logmsg"
  echo "path/to/somefile.txt.3.fdsf2d"
  echo "path/to/somefile.txt.3.fdsf2d.logmsg"
  echo "..."
  exit;
}

if [ "$1" == "help" ]
then
  show_help
fi
if [ -z "$1" ]
then
  show_help
fi

ROOT_FOLDER=$(git rev-parse --show-toplevel)
CURR_DIR=$(pwd)
if [ "$ROOT_FOLDER" != "$CURR_DIR" ]
then
  echo "Switch to the root of the repo and try again. Should be in $ROOT_FOLDER"
  exit
fi

function git_log_message_for_commit
{
  IT=$(git log -1 --pretty=format:"%an, %s, %b, %ai"  $*)
  echo $IT
}

function git_log_short
{
  git log --oneline --decorate $*
}

function choose_col
{
  COL=$1
  if [ -z "$2" ]
  then
    OPTS=
  else
    OPTS="-F\\${2}"
  fi
  awk $OPTS -v col="$COL" '{print $col}' 
}

cd $ROOT_FOLDER
FILENAME=$*
HASHES=$(git_log_short $FILENAME | choose_col 1)
INDEX=1

for HASH in $HASHES
do
  INDEX_OUT=$(printf %03d $INDEX)
  OUT_FILENAME="$FILENAME.$INDEX_OUT.$HASH"
  OUT_LOG_FILENAME="$FILENAME.$INDEX_OUT.$HASH.logmsg"
  echo "saving version $INDEX to file $OUT_FILENAME for hash:$HASH"
  echo "*******************************************************" >>  $OUT_LOG_FILENAME
  git_log_message_for_commit $HASH >> $OUT_LOG_FILENAME
  echo "  $HASH:$FILENAME " >> $OUT_LOG_FILENAME
  echo "*******************************************************" >> $OUT_LOG_FILENAME

  git show $HASH:$FILENAME >> $OUT_FILENAME
  let INDEX=INDEX+1
done
8 голосов
/ 05 октября 2015

Используйте стандартный графический инструмент git:

 gitk --all -- path/to/file

Отображает историю версий, урезанную до коммитов, которые влияют на path/to/file.

В качестве режима отображения для сравнения между текущей ( новой ) версией и предыдущей ( старой ) версией вы можете выбрать:

  • старая версия или
  • новая версия или
  • diff

Кроме того, вы можете выбрать коммит, а затем щелкнуть правой кнопкой мыши другой коммит и выбрать Разблокировать это -> выбранный в контекстном меню. Все, что вы хотели.

2 голосов
/ 27 декабря 2009

Я написал инструмент, который поможет вам в этом (распечатывая все содержимое файла, как это было в SHA-1-WHATEVER.

ГИТ-кошка

Вы можете либо поместить небольшой сценарий оболочки поверх этого, чтобы сделать все автоматически, либо файл README.markdown в этом хранилище также дает ссылки на то, где я изучил все, что мне нужно для написания команды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...