Как удалить автора из репозитория git? - PullRequest
8 голосов
/ 12 августа 2010

Если я создаю Git-репозиторий и публикую его публично (например, на GitHub и т. Д.), И я получаю запрос от участника в репозитарии, чтобы удалить или скрыть его имя по любой причине, есть ли способ сделать это легко

По сути, у меня был такой запрос, и, возможно, я хочу заменить его имя и адрес электронной почты на что-то вроде «Anonymous Contributor» или, возможно, SHA-1-хэш своего адреса электронной почты или что-то в этом роде.

Ответы [ 4 ]

6 голосов
/ 12 августа 2010

Джефф совершенно прав, правильный путь - это git filter-branch.Ожидается скрипт, который играет с переменными окружения.Для вашего случая использования вы, вероятно, хотите что-то вроде этого:

git filter-branch --env-filter '
    if [ "$GIT_AUTHOR_NAME" = "Niko Schwarz" ]; then \
        export GIT_AUTHOR_NAME="Jon Doe" GIT_AUTHOR_EMAIL="john@bugmenot.com"; \
    fi
    '

Вы можете проверить, что это работает так:

$ cd /tmp
$ mkdir filter-branch && cd filter-branch
$ git init
Initialized empty Git repository in /private/tmp/filter-branch/.git/
$ 
$ touch hi && git add . && git commit -m bla
[master (root-commit) 081f7f5] bla
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 hi
$ echo howdi >> hi && git commit -a -m bla
[master a466a18] bla
 1 files changed, 1 insertions(+), 0 deletions(-)
$ git log
commit a466a18e4dc48908f7ba52f8a373dab49a6cfee4
Author: Niko Schwarz <niko.schwarz@gmail.com>
Date:   Thu Aug 12 09:43:44 2010 +0200

    bla

commit 081f7f50921edc703b55c04654218fe95d09dc3c
Author: Niko Schwarz <niko.schwarz@gmail.com>
Date:   Thu Aug 12 09:43:34 2010 +0200

    bla
$ 
$ git filter-branch --env-filter '
> if [ "$GIT_AUTHOR_NAME" = "Niko Schwarz" ]; then \    
> export GIT_AUTHOR_NAME="Jon Doe" GIT_AUTHOR_EMAIL="john@bugmenot.com"; \
> fi
> '
Rewrite a466a18e4dc48908f7ba52f8a373dab49a6cfee4 (2/2)
Ref 'refs/heads/master' was rewritten
$ git log
commit 5f0dfc0dc9a325a3f3aaf4575369f15b0fb21fe9
Author: Jon Doe <john@bugmenot.com>
Date:   Thu Aug 12 09:43:44 2010 +0200

    bla

commit 3cf865fa0a43d2343b4fb6c679c12fc23f7c6015
Author: Jon Doe <john@bugmenot.com>
Date:   Thu Aug 12 09:43:34 2010 +0200

    bla

Пожалуйста, будьте осторожныНет способа удалить имя автора без аннулирования всех последующих хэшей коммита.Это сделает последующее объединение болью для людей, которые использовали ваш репозиторий.

2 голосов
/ 03 декабря 2014

Если вам когда-либо придется «анонимизировать» git-репо не только для одного пользователя, но и для всех пользователей, Git 2.2 (ноябрь 2014 г.) предоставляет интересную функцию с улучшенной и улучшенной git fast-export:

См. коммит a872275 и коммит 75d3d65 от Джефф Кинг (peff) :

учить fast-export опция --anonymize:

Иногда пользователи хотят сообщить об ошибке, с которой они сталкиваются в своем хранилище, но они не могут поделиться содержимым хранилища.
Этобыло бы полезно, если бы они могли создать хранилище, имеющее форму, аналогичную его истории и дереву, но без утечки какой-либо информации.
Этот «анонимизированный» хранилище можно было бы затем предоставить разработчикам (при условии, что он все еще повторяет исходную проблему).

Этот патч реализует опцию "--anonymize" для fast-export, которая генерирует поток, который может воссоздать такое хранилище.
Создание отдельного потока позволяет вызывающей стороне проверить, что онине пропускаю никакой полезной информации.Вы можете получить общее представление о том, что будет предоставлено, запустив команду, например:

git fast-export --anonymize --all |
perl -pe 's/\d+/X/g' |
sort -u |
less

, которая покажет каждую уникальную строку, которую мы генерируем, по модулю любых чисел (каждому анонимному токену присваиваетсячисло, например «User 0», и мы последовательно заменяем его в выходных данных).

В дополнение к анонимизации это создает сравнительно небольшие тесты (по сравнению с исходным хранилищем) и быстрыедля генерации (по сравнению с filter-branch или изменением вывода fast-export самостоятельно)

Doc:

Если опция --anonymizeучитывая, что git будет пытаться удалить всю идентифицирующую информацию из хранилища, сохраняя при этом достаточно исходного и древовидного паттернов, чтобы воспроизвести некоторые ошибки.

С помощью этой опции git заменит все refnames, paths,содержимое BLOB-объектов, фиксация и пометка сообщений, имен и адресов электронной почты в выходных данных анонимными данными .
Два экземпляра одной строки будут заменены наvalently (например, два коммита с одним и тем же автором будут иметь одного и того же анонимного автора в выводе, но не будут иметь сходства с исходной строкой автора).
Отношение между коммитами, ветвями и тегами + сохраняется, а такжеметки времени фиксации (но сообщения фиксации и имена ссылок не имеют никакого сходства с оригиналами).
Относительная структура дерева сохраняется (например, если у вас есть корневое дерево с 10 файлами и 3 деревьями, то и вывод будет), но их имена и содержимое файлов будут заменены.

1 голос
/ 12 августа 2010

Если вы хотите изменить более одного коммита, обратитесь к справочной странице для

git filter-branch --env-filter

Вы можете использовать git-filter-branch для изменения содержимого / мета предыдущих коммитов.

Обратите внимание, что, поскольку вы не имеете дело с локальной веткой (она уже была отправлена ​​на github), у вас нет способа удалить автора из любого, кто уже клонировал вашу ветку.

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

1 голос
/ 12 августа 2010

Вы можете внести изменения в свой локальный репозиторий, git commit --amend соответствующий коммит (где вы добавили имя), а затем git push --force, чтобы обновить github с вашей версией репозитория.

Оригиналcommit с именем участника будет по-прежнему доступен в reflog (пока не истечет срок его действия, но потребуется много усилий, чтобы найти его. Если это проблема, вы также можете удалить этот конкретный коммит из reflog - см. git help reflog для синтаксиса и как найти его в списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...