Удалить каталог.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.