git format-patch для всех коммитов в файл
Я хочу получить патчи для всех коммитов, которые сделаны в файл / папку.
Я могу получить список commit-id через git log --format="%H"-- path/to/folder
Есть ли способ получить патчи из этого списка.
[редактировать]:
код ниже частично решает мою проблему
for c in `git log --format="%H" -- path/to/file`;do
git format-patch "$c^1".."$c" -o patches ;
done
Так как формат-патч вызывается индивидуально, я получу все патчи с номером 0001-commit-text.patch, где я потеряю порядок патчей. Есть ли лучшие решения
4 ответа
Придумайте приведенный ниже сценарий оболочки для достижения этой цели. любые другие ответы приветствуются.
#!/bin/bash
COUNTER=1;
for c in `git log --format="%H" --reverse -- path/to/file`;do
git format-patch --start-number=$COUNTER "$c^1".."$c" -o patches
let COUNTER=COUNTER+1
done
Вы можете попробовать git diff initial_commit_id..latest_commit_id > changes.patch
Это основано на этой статье: https://www.lullabot.com/articles/git-best-practices-upgrading-the-patch-process
Например:
git diff ab0b3a55de5..6f5dbbc4187b97
Обновление: если вы указали путь к конкретному файлу в качестве аргумента для format-patch, он будет создавать патчи только для коммитов с изменениями в этом файле. Так что нет необходимости в цикле и одномоментном вызове format-patch. Смотрите пример в format-patch для одного файла
Так что попробуйте это:
get format-patch from..to -o patches /path/to/file
Моя небольшая импровизация (только что сочиненная) с использованием только
git
:
git format-patch $(git rev-list --max-parents=0 HEAD)..HEAD -- path/to/file
Может не работать, если
rev-list --max-parents
возвращает более одного коммита. Использована идея из этого поста:
Основываясь на остальных ответах.
Если вам нужны все коммиты для файла, который находится в начальном/самом первом коммите, вы должны опустить SHA. Даже<SHA>^1
в этом случае "работать" не будет.
git format-patch --root
Ссылаясь на Как использовать git format-patch при первоначальной фиксации