Как я могу перечислить все различные версии файла, а также их различия?
Используя git, я хочу перечислить все различные ревизии данного файла.
Затем я хочу выбрать конкретную версию и сравнить ее при другой.
Как я могу это сделать?
4 ответа
Чтобы показать историю изменений в конкретном файле, вы можете использовать git log
:
git log -p -- path/to/file
-p
говорит ему показать разницу между каждой ревизией и ее родителем. Чтобы получить кумулятивную разницу между двумя ревизиями, возьмите идентификатор двух ревизий и передайте их git diff
:
git diff abc123 def456 -- path/to/file.
куда abc123
а также def456
являются идентификаторами ревизий.
Вы можете использовать скрипт, подобный этому, чтобы выгрузить все версии файла в отдельный файл:
например
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
Используйте стандартный графический инструмент git:
gitk --all -- path/to/file
Он отображает историю версий, урезанную до коммитов, которые влияют path/to/file
,
В качестве режима отображения для сравнения между текущей (новой) версией и предыдущей (старой) версией вы можете выбрать:
- старая версия или
- новая версия или
- разница
Кроме того, вы можете выбрать коммит, а затем щелкнуть правой кнопкой мыши другой коммит и выбрать Diff this -> selected в контекстном меню. Все, что вы хотели.
Я написал инструмент, который поможет вам в этом (распечатывая все содержимое файла, как это было в SHA-1-WHATEVER).
Вы можете либо поместить небольшой сценарий оболочки поверх этого, чтобы сделать все автоматически, либо файл README.markdown в этом хранилище также дает ссылки на то, где я изучил все, что нужно для написания команды.