Git удаляет файлы из репозитория, Github и коммиттеров - PullRequest
3 голосов
/ 02 августа 2011

Кто-то случайно зарегистрировал JPG на 80 мегабайт в нашем git-репозитории и отправил его в центральный репозиторий github.

Несколько человек с тех пор потянули эти изменения.

Помимо съемки коммиттера, что я могу сделать, чтобы полностью удалить эти изображения из истории репозитория и github? А затем применить все изменения к другим коммиттерам.

Ответы [ 4 ]

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

Вам нужно исправить изменения с помощью git reset sha_of_last_good_commit, а затем увеличить эти резервные копии с помощью git push -f. Затем вам нужно будет сказать всем, чтобы вытащить новые изменения обратно.

  • Если есть какие-то изменения, которые вы хотите оставить смешанными с плохими коммитами, вам нужно будет git rebase -i вытащить те, которые вам не нужны, прежде чем вы начнете репо fixed обратно на github.

  • Сборщик мусора в конечном итоге удалит висячие объекты, или вы можете принудительно вызвать его с помощью git gc --aggressive

1 голос
/ 02 августа 2011

Более радикальный подход использует filter-branch.

git filter-branch --tree-filter 'rm -f *.jpg' HEAD

Однако вы должны быть ОЧЕНЬ осторожными при использовании этого, поскольку вы действительно можете испортить репо.Вы должны проверить документы , прежде чем делать что-либо.

0 голосов
/ 02 августа 2011

Даже если вы git reset --hard HEAD~3, а затем git push --force проблема не решена.

Как gpojd цитирует:

Не делайте этогоесли вы уже дали эти коммиты кому-то еще

Но вы сделали.Если вы передали измененную версию в центральное репо, а кто-то, кто получил версию, включающую три плохих коммита из центрального репо, все три плохих коммита все еще будет присутствовать в его / ее репо.из репо, когда присутствовали три плохих коммита, нужно будет удалить эти неправильные коммиты из своего репо, чтобы снова их очистить.

Так что скажите им, чтобы они запустили консоль и использовали git fetch origin (чтобыполучите версию из GitHub) git rebase -i origin/master, чтобы перебазировать их основную ветвь на принудительно выдвинутую и сообщить им SHA-идентификаторы коммитов, которые они должны будут удалить.

0 голосов
/ 02 августа 2011

Используйте git reset , чтобы отменить изменения до фиксации этого человека.Я не думаю, что возможно заставить обновление для людей, которые уже потянули изменения.

git reset --hard HEAD~3 ## will reset the head to three commits ago

Если подумать, документы говорят:

Последние три коммита (HEAD, HEAD ^ и HEAD ~ 2) были плохими, и вы никогда не захотите когда-либоувидеть их снова.Не делайте этого, если вы уже передали эти коммиты кому-то другому.

tl; dr - Просто удалите файлы.Я не знаю, что вы можете удалить историю, и вы не можете заставить что-то обновляться в распределенной системе, такой как git.

...