Как добавить файл в первый коммит на git-репо? - PullRequest
15 голосов
/ 03 сентября 2011

Я конвертировал старые репозитории SVN в GIT. Я получил ветви и теги для конвертации. В том числе создание реальных тегов SVN в GIT.

Однако я хотел бы добавить gitignore к самому первому коммиту во вновь созданном репозитории GIT. Я хочу, чтобы это было так, как будто файл всегда был там. Таким образом, все последующие коммиты (на главном или в ветвях) теперь будут иметь этот файл, поскольку родительское дерево (а) будет возвращать первый коммит.

Кажется, мне нужна какая-то форма git rebase или git filter-branch --tree-filter. Я пробовал каждый из них, но в итоге получаю отключенные ветви.

Ответы [ 3 ]

14 голосов
/ 02 апреля 2012

Если кому-то понадобится сделать это в будущем, вот более простое решение.Недавно мне пришлось изменить ранний коммит из-за проблемной опечатки в сообщении коммита.Это работает для изменения чего-либо о предыдущем коммите.Я изменил 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

Обратите внимание, что это изменит все ваши идентификаторы коммитов после исправленного коммита, поэтому он не рекомендуетсяпубличный репозиторий.Кроме того, вам придется воссоздать все ваши теги

1 голос
/ 04 сентября 2011

Сделайте это на чистом рабочем дереве, на новом клоне, если хотите:

$ 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

Не проверено;)

0 голосов
/ 04 сентября 2011

Предполагая, что это совершенно новая перестройка, один из трюков состоит в том, чтобы запустить ветку при первом коммите и добавить туда gitignore. Теперь у вас есть «правильный» коммит во главе этой ветви. Теперь для хитрости - вы используете средство grafts, чтобы изменить порядок предполагаемой последовательности коммитов. Обычное значение git filter-branch сделает его постоянным, хотя старая иерархия будет по-прежнему перечисляться в originals в refs \ info (IIRC).

Хотя это создаст ранний коммит, содержащий файл gitignore, все остальные коммиты по-прежнему будут без файла gitignore.

Edit: ---------- git-filter-branch , приводит примеры:

git filter-branch --tree-filter 'rm filename' HEAD и вариант --index-filter.

Вы можете просто add .gitignore ваш .gitignore вместо удаления и использовать --index-filter, чтобы ваше рабочее дерево оставалось целым для копирования из.

Сначала убедитесь, что у вас есть резервная копия! Сообщите, работает ли он у вас.

...