Найти / заменить в Git Commit Log - PullRequest
2 голосов
/ 17 марта 2012

Как я могу переписать нашу историю коммитов, чтобы определенные ключевые слова никогда не появлялись?

Справочная информация: у нас есть три уровня хранилищ:

  1. Локальные - нашисреды разработки.
  2. Внутренний - личный репозиторий GH нашей команды
  3. Клиент - Производственный / конечный клиент.Все наши настоящие имена, электронные письма и т. Д. Никогда не должны делать это здесь.

Я уже обнаружил, что git-filter-branch может помочь переписать историю, чтобы удалить имена, используя что-то вроде этого ...

git filter-branch -f --env-filter "GIT_AUTHOR_NAME='safeusername'; GIT_AUTHOR_EMAIL='safe@email.com'; GIT_COMMITTER_NAME='safeusername'; GIT_COMMITTER_EMAIL='safe@email.com';" HEAD

Кажется, это прекрасно работает.Когда я нажимаю на последний пульт, ни одно из наших имен не присутствует.Однако после некоторых слияний я не хочу, чтобы какие-либо имена филиалов или другие комментарии потенциально появлялись случайно.

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

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

Спасибо!

1 Ответ

0 голосов
/ 17 марта 2012

Хорошо, общий поток, который вы хотите сделать для чего-то подобного:

  • клонировать / извлекать в неизмененный репо (возможно, каждый раз новый, возможно, повторное использование)
  • запустить фильтр-ветку, творить магию
  • убедитесь, что все безопасно
  • опубликовать в репозитории клиента

Итак, во-первых: магия. Вы захотите использовать git filter-branch --commit-filter my-commit-filter-script. Он вызывается напрямую вместо дерева коммитов, принимает необходимые аргументы и сообщение коммита на stdin. Итак, вы захотите сделать что-то вроде этого:

#!/bin/bash

GIT_AUTHOR_NAME=$(sanitize "$GIT_AUTHOR_NAME")
# ... similar for AUTHOR_EMAIL, COMMITTER_(NAME|EMAIL)

sed 's/scary-string/safe-string/' |
git commit-tree "$@"

То есть измените имена и электронные письма через соответствующие переменные среды, запустите любую фильтрацию сообщения, которая вам нужна, и направьте ее к вызову дерева коммитов, который был бы выполнен нормально. sanitize предназначен для того, чтобы быть функцией / скриптом, который выполняет некоторое личное-> общедоступное отображение имен / электронных писем; если все, что вы хотите сделать, это изменить их все на одно имя, то этот бит действительно прост. И команда sed, вероятно, может быть чем-то более изощренным, например, для чтения таблицы преобразований. Это зависит от вас, в зависимости от сложности процесса очистки, который вам необходим.

Если вы доверяете своей фильтрации сообщений о коммитах, значит, все готово. Если вы хотите проверить, вы можете сделать это вручную, или вы можете самостоятельно искать «опасные» строки. Например, если у вас есть файл dangerous-strings.txt, вы можете сделать git log --pretty="%an %ae %cn %ce%n%B" [branches] | grep -f dangerous-strings.txt. (Команда log выводит имя автора / коммиттера / адрес электронной почты, за которым следует сообщение о коммите.)

Затем опубликуйте как обычно - нажмите, предположительно.

Наконец, несколько альтернативных предложений, возможно, для будущих читателей с различными требованиями:

  • Вместо того чтобы переписывать коммиты, делайте новые коммиты. Сообщение может быть просто информацией о быстром версионировании (включая SHA1 внутренней фиксации, которую оно представляет), или оно может включать краткий список вводимых коммитов (только субъекты). Вы можете сделать это, сохранив ветку публикации и используя git merge --squash [--log] или сделав коммит свежим в отдельном репозитории, после копирования вещей в

  • Храните репо в форме, которая не нуждается в трансформации. Это кажется невозможным для ОП, но если ваша ситуация иная, сделайте это просто. Менее рискованно, меньше работы.

...