Git удаляет информацию о коммитере - PullRequest
2 голосов
/ 10 августа 2011

Я начал какой-то проект на github.com. И я работаю на двух машинах. Я сделал что-то вроде этого:

  1. Создать проект на github,
  2. Клон проекта GitHub на Machine1,
  3. Сделали ли некоторые коммиты на Machine1,
  4. Создан репозиторий на Machine2,
  5. Нажмите изменения с Machine1 на Machine2 и github.

На следующий день я работал над Machine2. У меня там разные конфиги, поэтому я делал коммиты с параметром "--author = что-то". После окончания работы я перенес свои изменения в Machine1.

Я перенес свои изменения с Machine1 на github. И я вижу, что коммиты, сделанные на Machine1, имеют в истории поданную Author, которая является правильной, и также поданную Committer, которая является от Machine1. И я не хочу обнародовать этот коммиттер подал. Как я могу это удалить?

Временно я сделал на Machine1:

git reset --hard <commit before changes on Machine1>
git push -f github master

Но похоже, что получение информации о коммитере все еще возможно. Как удалить это навсегда.

С уважением,

Адам

1 Ответ

4 голосов
/ 10 августа 2011

Если вы хотите изменить только информацию о коммиттере, вы можете использовать git rebase, который принимает ваши коммиты и воспроизводит их поверх другого коммита. Здесь важна опция --no-ff, так как она гарантирует, что каждый коммит будет воссоздан. В противном случае git будет перемотан вперед в случае, если перебазировка будет запрещена.

GIT_COMMITTER_NAME=Adam;
GIT_COMMITTER_EMAIL=adam@example.com;
export GIT_COMMITTER_NAME;
export GIT_COMMITTER_EMAIL;
git rebase --no-ff <commit before changes on Machine1>

Это быстро усложняется, когда ваша история немного сложнее (сливается), в этом случае может быть лучше использовать filter-branch.

Если вы также хотите изменить информацию об авторе, используйте git filter-branch и перепишите все свои коммиты с помощью --env-filter. обязательно иметь резервную копию на случай, если моя команда ошибочна;) - хотя я на это не надеюсь

git filter-branch --env-filter '
GIT_AUTHOR_NAME=Adam;
GIT_AUTHOR_EMAIL=adam@example.com;
export GIT_AUTHOR_NAME;
export GIT_AUTHOR_EMAIL;

git commit-tree "$@";
' <commit before changes on Machine1>..HEAD

вы также можете использовать --all вместо refspec, чтобы переписать все коммиты в вашем хранилище

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

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