Хорошо, общий поток, который вы хотите сделать для чего-то подобного:
- клонировать / извлекать в неизмененный репо (возможно, каждый раз новый, возможно, повторное использование)
- запустить фильтр-ветку, творить магию
- убедитесь, что все безопасно
- опубликовать в репозитории клиента
Итак, во-первых: магия. Вы захотите использовать 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]
или сделав коммит свежим в отдельном репозитории, после копирования вещей в
Храните репо в форме, которая не нуждается в трансформации. Это кажется невозможным для ОП, но если ваша ситуация иная, сделайте это просто. Менее рискованно, меньше работы.