Скрипт для перестройки истории git, применяя очистку кода к каждой версии - PullRequest
2 голосов
/ 23 марта 2010

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

У меня есть какой-то код, который я разрабатывал, но я не соответствовал форматированию кода, например табуляции против пробелов и т. д. Я хотел бы переписать всю свою историю, чтобы соответствовать новым стандартам.

1 Ответ

5 голосов
/ 23 марта 2010

Команда git filter-branch делает то, что вам нужно.

Например:

# Make a backup!
cp -r <repo> <repo>.backup
cd <repo>
# Replace tabs with two spaces in all .cpp and .h files in all branches.
git filter-branch --tree-filter \
  "find \( -iname '*.cpp' -o -iname '*.h' \) \
   -exec sed -i -re 's/\t/  /g' {} \;" -- --all
# Delete branch backups created by 'git filter-branch'.
# From the end of `man git filter-branch`; more cleanup
# suggestions there.
git for-each-ref --format="%(refname)" refs/original/ | \
  xargs -n 1 git update-ref -d
# You still have ../<repo>.backup, in case something went wrong.

Но будьте осторожны ... это преобразует репозиторий git. Если у кого-то есть клон ... он больше не будет связан с вашим новым репо. От man git filter-branch:

ВНИМАНИЕ! Переписанная история будет иметь разные имена объектов для все объекты и не будут сходиться с исходной ветвью. Вы не сможет легко пихать и распространять переписанную ветку поверх оригинальной ветки. Пожалуйста, не используйте эту команду, если вы не знаете всех последствий, и все равно избегаете его использования, если для решения вашей проблемы будет достаточно простого коммита. (Увидеть раздел «ВОССТАНОВЛЕНИЕ ОТ UPSTREAM REBASE» в git-rebase (1) для дополнительная информация о переписывании опубликованной истории.)

...