Удалить файл из нескольких (всех) коммитов в ветке в Mercurial? - PullRequest
0 голосов
/ 28 декабря 2018

Я видел Удаление файла из коммита в Mercurial - но у меня очень мало опыта работы с Mercurial, поэтому я хотел бы спросить и убедиться, выполнимо ли это и как.

Существует программное обеспечение, разработанное в Mercurial, и я хотел попробовать добавить функцию.Поэтому, когда я клонировал репо, сначала я добавил свою собственную ветку и начал там взламывать.Уже в первом или втором коммите этой ветки я добавил несколько файлов hg add test1.bmp, hg add test2.bmp и так далее, и зафиксировал.

Затем я продолжал взламывать другие файлы (с тех пор не трогал эти test1.bmp, test2.bmp и т. Д.) И делал около 3 или 4 коммитов после коммита, в который добавляются bmp.Ничто нигде не было перенесено - моя локальная копия репозитория Mercurial и моя ветка в нем - единственное место, где есть ссылки на эти файлы.И только сейчас я понимаю, что вообще не должен был добавлять эти файлы.

Можно ли удалить эти файлы из всех коммитов, где они представлены, начиная с первого коммита, где они были добавлены?

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

1 Ответ

0 голосов
/ 28 декабря 2018

Да, это возможно.

Тем не менее, это более продвинутый вариант использования Mercurial, и вам потребуется включить в аренду одно расширение.

Как новый пользователь, я бы рекомендовал:просто используйте базовое управление Mercurial и удалите файлы, которые вас интересуют:

hg remove <file>

Затем вы можете зафиксировать изменение.

Хотя это не приведет к удалению файла (-ов) из всех наборов изменений, это удалит это, идя вперед.Честно говоря, это рекомендуемый способ управления рабочим контентом.

Следует отметить, что это, вероятно, единственный вариант, если вы отправили изменения в родительский репозиторий.Если вы отправили свои изменения в родительский репозиторий, вам также придется отредактировать его, что значительно усложнит ситуацию и повысит вероятность серьезной ошибки.

Если вы действительно хотите удалить его из предыдущих наборов изменений, вам нужно включить расширение histedit (входит в состав Mercurial).

[extensions]
histedit =

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

Процесс, который я рекомендую для этого, выглядит следующим образом:

Примечание: это работает только так, как описано для наборов изменений, которые не были отправлены и имеют фазу = черновик (или секрет)

1) Определите все изменения, где файл (ы) добавляются или изменяются

Вам необходимо знать каждый набор изменений, где файл (ы) были изменены или добавлены.Вам нужно будет изменить каждый из этих наборов изменений в обратном порядке, в котором они были добавлены.

Вы можете использовать:

hg log file

, чтобы вывести список наборов изменений, где файл был изменен или добавлен.

2) Медленно редактируйте каждый затронутый набор изменений (работая в обратном направлении)

Используйте histedit для отображения всех отображений всех наборов изменений, которые можно изменить / отредактировать в редакторе по умолчанию.

hg histedit

Найдите первый набор изменений, который вы определили, и измените его от выбора до редактирования и сохраните изменение.

Это переведет вас в режим редактирования histedit.Это состояние незадолго до фиксации изменений.Это означает, что вы можете вносить изменения, такие как изменение, изменение.Добавление или удаление контента.В этом случае мы хотим отменить любые изменения в файле (ах), о которых идет речь.

hg revert file

или

hg remove file (if this is the changeset where the file as added)

3) возобновить набор изменений

Как только вы получитедля изменения / добавления файла в обратном порядке, вам нужно сообщить histedit, что вы сделали.

hg histedit --continue

Это приведет к повторной отправке набора изменений с внесенными вами изменениями, включая редактирование сообщения о фиксации.Повторяйте это для каждого набора изменений до его завершения.

Примечание. Хотя вы можете выбрать несколько изменений для редактирования в histedit, я рекомендую делать по одному за раз, чтобы уменьшить сложность.Не забывайте делать в обратном порядке, что они обязались, чтобы помочь уменьшить / устранить любые конфликты слияния.

Снова рекомендую практиковаться в копии репозитория, пока вы не будете твердо понимать процесс.Так как вы изменяете историю репозитория, это может иметь потенциальные негативные последствия ошибки.

Я настоятельно рекомендую прочитать это: https://book.mercurial -scm.org / read / change-history.html .

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