Как добавить файл к первой фиксации в репозитории 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