Удалить каталог.git из git repo?

Я пытаюсь перенести Git-репо из Kiln в Github. Я могу добавить новый пульт просто отлично, но когда я пытаюсь вставить мастер на новый пульт, я получаю следующую ошибку:

Counting objects: 8691, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3000/3000), done.
remote: error: object a9ee490ac00987835de30bdbc851da5e8d45d28b:contains '.git'
remote: fatal: Error in object
error: pack-objects died of signal 13
error: failed to push some refs to 'git@github.com:Account/repo.git'

совершить a9ee490ac00987835de30bdbc851da5e8d45d28b содержит следующие файлы:

.git/
CHANGELOG.md
JSONKit.h
JSONKit.m
README.md

Очевидно, кто-то в прошлом, используя hg, проверил в полном git репо в подкаталоге.

Я хотел бы просто полностью убить этот каталог, но у меня проблемы с удалением этого файла из истории git.

Ответ на отправку репозитория git терпит неудачу с ошибкой: содержит ".git", не помогает, потому что репозиторий является репозиторием git, а не ртутным.

Я старался git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch .git', но я получаю ошибку:

Rewrite 7dbd0970d6c79215d11994b4a9b8091b2e954cfb (326/442)error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/HEAD'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/config'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/description'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/hooks/applypatch-msg.sample'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/hooks/commit-msg.sample'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/hooks/post-update.sample'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/hooks/pre-applypatch.sample'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/hooks/pre-commit.sample'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/hooks/pre-rebase.sample'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/hooks/prepare-commit-msg.sample'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/hooks/update.sample'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/index'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/info/exclude'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/logs/HEAD'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/logs/refs/heads/master'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/objects/pack/pack-43fac03d375df5c1e380c5e522ba6bcb9b4e1ec1.idx'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/objects/pack/pack-43fac03d375df5c1e380c5e522ba6bcb9b4e1ec1.pack'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/packed-refs'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/refs/heads/master'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/refs/remotes/origin/HEAD'

и история, кажется, не изменилась. Я на пределе своих мерзких знаний. Кто-нибудь может помочь?

4 ответа

Используйте BFG Repo-Cleaner, более простую и быструю альтернативу git-filter-branch специально разработан для удаления файлов из истории Git.

Тщательно выполните следующие действия: https://rtyley.github.io/bfg-repo-cleaner/ но основной момент заключается в следующем: загрузите JAR- файл BFG (требуется Java 6 или выше) и выполните эту команду:

$ java -jar bfg.jar --delete-folders .git --delete-files .git --no-blob-protection my-repo.git

Вся ваша история репозитория будет отсканирована, и любой файл или папка .git будут удалены Я проверил это на специально построенном тестовом репо, содержащем .git папка, и все работало просто отлично.

Спасибо Мишелю Жувену за напоминание о том, что файлы с именем ".git" также недопустимы в Git (и сообщение об ошибке, сообщаемое Git, не делает сразу очевидным, что это файлы, а не папки), я обновил этот ответ чтобы отразить это.

Полное раскрытие: я являюсь автором BFG Repo-Cleaner.

Начиная с git 2.2.22, это можно сделать с помощью инструмента git-filter-repo.

Легко и быстро:

git filter-repo --force --invert-paths --path-glob '*/.git' --path '.git'

Вы пробовали с помощью следующей команды?

git filter-branch --tree-filter 'rm -Rf .git' HEAD

В документации git filter-branch указано, что это будет медленнее, чем --index-filter, но это может сделать работу.

Другой способ справиться со случаем, когда в репозитории Mercurial (Hg) встроена папка.git, - это сначала "исправить" репозиторий Hg перед экспортом в Git. Laurens Holst есть отличный способ сделать это.

Если папка.git была в корне вашего проекта, то вы создаете текстовый файл, my-filemap это выглядит так:

exclude ".git"

Включите расширение Convert в вашем файле.hgrc:

[extensions]
convert =

Затем отфильтруйте папку.git, используя расширение Hg convert:

hg convert --filemap my-filemap originalrepo newrepo

Теперь вы можете экспортировать из newrepo, и у вас не будет проблемы со встроенной папкой.git.

Вы также можете использовать git fsck чтобы убедиться, что с новым репозиторием Git все в порядке, перед тем как нажать его.

Насколько я понимаю, kiln позволит вам клонировать репозиторий как git или Mercurial в наши дни, так что клонируйте его как mercurial, используйте уже найденное решение с файловой картой mercurial, вставьте репозиторий Mercurial в качестве нового репо в Kiln, а затем клонируйте его как git, Тогда у вас будет git-репо, которое вы можете отправить на github.

Другие вопросы по тегам