2010-08-20 4 views
0

Несколько сообщений говорят об удалении файла или каталога из GIT - но они не доходят до объяснения того, как PUSH эти изменения в основной репозиторий.Как зафиксировать после удаления каталога из GIT

Например, this работает нормально, чтобы удалить каталог, но когда я пытаюсь PUSH этого изменения основного Гит репо, мне отказано:

! [rejected]  master -> master (non-fast forward) 
error: failed to push some refs to '/repo/project.git' 
To prevent you from losing history, non-fast-forward updates were rejected 
Merge the remote changes before pushing again. See the 'non-fast forward' 
section of 'git push --help' for details. 

Что является последним шагом на самом деле толкать это основное репо и фактически удалить этот каталог?

+1

Думаю, вы не только удалили каталог с помощью 'git rm', но и переписали всю историю. Если вы измените старые коммиты, вы не можете зафиксировать их поверх оставшихся на сервере. –

ответ

2

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

git push --force 
+1

... но вы должны понимать, что делаете, и убедитесь, что вы действительно хотите это сделать. См. Мой ответ. – Cascabel

+0

Вы редко хотите - направить удар. 99% времени, недостатки перевешивают выгоды. – brycemcd

+0

Yep - оцените предупреждения и поймите, что это определенно не очень хорошая практика - особенно в групповой обстановке. В моем случае это только я, и я случайно совершил какой-то автоматически сгенерированный код, который мне не нужен в репо (и я хочу чувствовать себя как Git Ninja :)), и это был один крайний случай, который мне нужно было лучше понять, как это сделать. –

1

Ника Льюиса достаточно, но я просто хочу, чтобы добавить акцент, больше, чем может поместиться в комментарии. Вот цитата со страницы git filter-branch людей:

ВНИМАНИЯ! Переписанная история будет иметь разные имена объектов для всех объектов и не будет сходиться с исходной ветвью. Вы не сможете легко нажимать и распространять переписанную ветку поверх исходной ветви. Пожалуйста, не используйте эту команду, если вы не знаете полных последствий и избегайте их использования в любом случае, если достаточно простой фиксации, чтобы исправить вашу проблему. (См «ВОССТАНОВЛЕНИЕ с верховьев перебазироваться» раздел в git-rebase(1) для получения дополнительной информации о перезаписи опубликованной истории.) Добавил

Курсив акцент - это очень важно. Фильтрационная ветвь действительно переписывает историю, она испортит всех, кто клонирован/вытащен из вашего репо, и это страшно. Вы должны действительно знать все это, прежде чем дать ему уйти. Большинство людей здесь очень хороши в предоставлении этого напоминания, когда они рекомендуют filter-branch или rebase; Я думаю, что это уместно иметь довольно сильное повторение этого здесь, на вопрос, где ответ push --force, чтобы полностью переписать историю в вашем публичном репо. Это страшная операция.

Смежные вопросы