Удаление каталога .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 '[email protected]:Account/repo.git'
Commit a9ee490ac00987835de30bdbc851da5e8d45d28b
имеет в нем следующие файлы:
.git/
CHANGELOG.md
JSONKit.h
JSONKit.m
README.md
Очевидно, что кто-то в прошлом, используя hg
, отмечен в полном репозитории git в подкаталоге.
Я хотел бы просто полностью убить этот каталог, но мне трудно удалить этот файл из истории git.
Ответ в нажатие git repo с ошибкой: содержит '.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'
и история, похоже, не изменяется. Я на пределе своих знаний git. Может ли кто-нибудь помочь?
Ответы
Ответ 1
Используйте BFG Repo-Cleaner, более простую и быструю альтернативу git-filter-branch
, специально разработанную для удаления файлов из истории Git.
Тщательно выполните следующие действия: https://rtyley.github.io/bfg-repo-cleaner/#usage - но основной бит такой: скачайте банку BFG (требуется Java 8 или выше) и выполните эту команду:
$ java -jar bfg.jar --delete-folders .git --delete-files .git --no-blob-protection my-repo.git
Вся ваша история репозитория будет отсканирована, и все файлы или папки с именем .git
будут удалены. Я проверил это на специально сконструированном тестовом репозитории, содержащем папку .git
, и он работал просто отлично.
Благодарю Мишеля Жувена за то, что он напомнил мне, что файлы с именем ".git" также недопустимы в Git (а сообщение об ошибке, сообщаемое Git, не дает сразу понять, что это файлы, а не папки), я Я обновил этот ответ, чтобы отразить это.
Полное раскрытие: я являюсь автором BFG Repo-Cleaner.
Ответ 2
Пробовали ли вы следующую команду?
git filter-branch --tree-filter 'rm -Rf .git' HEAD
git документация по фильтрам указывает, что это будет медленнее, чем --index-filter
, но это может сделать работу.
Ответ 3
Как я понимаю, печь позволит вам клонировать репозиторий как git или Mercurial в эти дни, поэтому клонируйте его как меркурийный, используйте меркантильное решение файлового файла, которое вы уже нашли нажмите, чтобы Mercurial repo стал новым репо в Kiln, а затем клонировал его как git. Тогда у вас будет git репо, которое вы можете нажать на github.
Ответ 4
Другой способ справиться со случаем, когда в репозитории 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 все в порядке, прежде чем нажать его.