Как добавить файл к первой фиксации в репозитории git?
Я конвертировал старые SVN-репозиции в GIT. У меня есть ветки и теги для конвертирования. Включение создания реальных тегов SVN в GIT.
Однако я хотел бы добавить gitignore к самому первому commit во вновь созданной репозитории GIT. Я хочу, чтобы это было так, как будто файл всегда был там. Таким образом, все последующие транзакции (на главном или в ветвях) теперь будут иметь этот файл, поскольку родительское дерево вернет первое коммит.
Кажется, что какая-то форма GIT rebase или GIT filter-branch -tree-filter - это то, что мне нужно. Я пробовал каждый из них, но в итоге я отключился от ветвей.
Ответы
Ответ 1
В случае, если кто-то должен это сделать в будущем, это более простое решение. Недавно мне пришлось изменить раннюю фиксацию из-за проблемной опечатки в сообщении commit. Это работает для изменения чего-либо о предыдущем фиксации. Я изменил Charles Bailey, чтобы ответить здесь.
# Go back to the commit you want to change (detach HEAD)
git checkout <sha1_for_commit_to_change>
# Make any changes now (add your new file) then add them to the index
git add <new_files>
# amend the current commit
git commit --amend
# temporarily tag this new commit
# (or you could remember the new commit sha1 manually)
git tag tmp
# go back to the original branch (assume master for this example)
git checkout master
# Replay all the commits after the change onto the new initial commit
git rebase --preserve-merges --onto tmp <sha1_for_commit_to_change>
# remove the temporary tag
git tag -d tmp
Обратите внимание, что это изменит все ваши идентификаторы фиксации после исправленного коммита, поэтому он не рекомендуется в публичном репозитории. Кроме того, вам придется воссоздать все ваши теги
Ответ 2
Сделайте это на чистом рабочем дереве, на новом клоне, если хотите:
$ git checkout -b withgitignore $firstcommithash
$ git add .gitignore
$ git commit --amend
$ for branch in branch1 branch2 branch3 ... ; do
git checkout $branch
git rebase withgitignore
done
Untested;)
Ответ 3
Предполагая, что это совершенно новая перестройка, тогда один трюк заключается в том, чтобы начать ветвь при первой фиксации и добавить там gitignore. Теперь у вас есть "правильная" фиксация во главе этой ветки. Теперь для трюка - вы используете средство grafts
для изменения порядка воспринимаемой последовательности фиксации. Простой git filter-branch
сделает его постоянным, хотя старая иерархия будет по-прежнему отображаться в originals
в refs\info (IIRC).
Пока это создаст раннюю фиксацию, содержащую файл gitignore, все остальные коммиты будут по-прежнему без файла gitignore.
Edit: ----------
git-filter-branch дает примеры:
git filter-branch --tree-filter 'rm filename' HEAD
и a --index-filter
.
Вы можете просто add .gitignore
использовать ваш .gitignore вместо удаления и использовать --index-filter
, чтобы ваше рабочее дерево по-прежнему было неповреждено для копирования.
Сначала убедитесь, что у вас есть резервная копия!
Сообщите, работает ли он для вас.
Ответ 4
Я бы предложил прочитать эту статью http://git.or.cz/course/svn.html, которая расскажет вам, как делать вещи в git, которые вы знаете, как это сделать в svn