Примечание: этот ответ о сокращении истории всего проекта, а не об удалении одного файла из более ранней истории, о которой был вопрос!
Самый простой способ сократить историю всего проекта с помощью git filter-branch - это использовать механизм прививки (см. макет хранилища документация), чтобы сократить историю:
$ echo "$commit_id" >> .git/info/grafts
, где $commit_id
- это коммит, который вы хотите использовать в качестве корня (первый коммит) нового репозитория. Проверьте с помощью «git log» или графического средства просмотра истории, такого как gitk, что история выглядит так, как вы хотите, и запустите «git filter-branch --all»; использование трансплантатов описано в документации git-filter-branch.
Или вы можете использовать неглубокий клон , используя --depth <depth>
опцию git clone .
Вы можете использовать grafts для удаления истории деталей одного файла (что было первоначально запрошено), используя шаги, описанные ниже. Это решение состоит из нескольких шагов, чем решение , предложенное Дэном Молдингом , но каждый из этих шагов проще, и вы можете проверить промежуточные шаги, используя "git log" или графический просмотрщик истории.
Сначала выберите точку, в которой вы хотите удалить файл, и отметьте эти коммиты, создав ветки в этих точках. Например, если вы хотите, чтобы файл впервые появился в коммите f020285b
и удалил его у всех своих предков, отметьте его как предка (при условии, что это обычный коммит без слияния), используя
$ git branch cleanup f020285b^
Во-вторых, удалите файл из истории, начинающейся с cleanup
(то есть f020285b^
), используя git-filter-branch, как показано в разделе «Примеры» git-filter-branch manpage:
$ git filter-branch --index-filter 'git rm --cached --ignore-unmatch big_manual.txt' cleanup
Если вы хотите удалить также все коммиты, которые были изменены только на удаленный файл, вы можете дополнительно использовать опцию --prune-empty
для git-filter-branch.
Далее, соедините переписанную часть истории с остальной историей, используя механизм пересадки:
$ echo $(git-rev-parse f020285b) $(git rev-parse cleanup) >> .git/info/grafts
Затем вы можете проверить историю, чтобы проверить, правильно ли она соединена.
Наконец, сделайте трансплантаты постоянными (это сделает все трансплантаты постоянными, но давайте предположим, что вы не используете трансплантаты в противном случае), используя git-filter-branch,
$ git filter-branch cleanup..HEAD
и удалите трансплантаты (так как они больше не нужны) и ветку cleanup
$ rm .git/info/grafts
$ git branch -d cleanup
Последнее замечание: если вы удалите часть истории некоторого файла, вам лучше убедиться, что проект без этого файла имеет смысл (и, например, правильно компилируется).