Вопрос по git – Как мне преобразовать пустой git-репозиторий в обычный (на месте)?
У меня есть пустой репозиторий git, но мне нужно получить доступ и просмотреть его содержимое по ssh (в файловом менеджере, например, в пользовательском интерфейсе).
Я полагаю, я мог бы клонировать это:
git clone -l <path_to_bare_repo> <new_normal_repo>
Однако размер моего репозитория составляет около 20 ГБ, и у меня нет места для его дублирования. Есть ли способ конвертировать пустой репозиторий на месте, чтобы получить рабочую копию?
git show
а такжеgit cat-file
William Pursell
.git
каталог и установитьbare
параметр в конфиге в false, он должен вести себя как обычный репозиторий, где вы можете простоgit checkout
чтобы получить ваши файлы.
Noufal Ibrahim
NoteЯ проверил это наvery simple 1-коммитное хранилище. Дважды проверьте это, прочитайтестраницы руководстваи всегда будьте счастливы, что вы сделали резервную копию, прежде чем следовать советам, которые вы нашли в StackOverflow. (Вы делаете резервную копию, верно?)
Чтобы преобразовать--bare
хранилище для не голого:
.git
folder in the top-level of your repository.
Move the repository management things (HEAD branches config description hooks info objects refs
etc.) into the .git
you just created.
Run git config --local --bool core.bare false
to convert the local git-repository to non-bare.
(via comment by Tamás Pap) After step #3 you will see that you are on branch master
(or whichever your main branch is) and all your files are deleted and the deletion is staged. That's normal. Just manually checkout master
, or do a git reset --hard
, and you are done.
(to resolve issue reported by Royi)
Edit .git/config
file adding line fetch = +refs/heads/*:refs/remotes/origin/*
after url = <...>
in [remote "origin"]
section. Otherwise git fetch
will not see origin/master
and other origin's branches.
Эти шаги в противоположном направленииэтот вопрос, "git-преобразовать обычный в пустой репозиторий" - в частности, примечаниеэтот ответ, в котором говорится, что вышеуказанные шаги (в, я полагаю, в любом направлении)different от выполненияgit-clone
, Не уверен, что это имеет отношение к вам, но вы упомянулиgit clone
в вопросе.
Решение:
clone a bare repo in that content, in a.git
dir:git clone --bare https://github.com/user/project .git
Mark it as a non-bare repo:git config --local --bool core.bare false
reset the index (otherwise, it believes everything has been deleted, since a .git
bare repo doesn't include a file 'index
'.)git reset HEAD -- .
That restores the
.git/index
.
Я эффективно превратил голое репо в не голое, сохранив контент, который получил ранее.
полный сценарий Я использую в течение многих лет включает в себя шаги:
cd /path/to/current/worktree
# That creates a .git directly at the right place
git clone --bare /url/of/repo .git
# restore the link between the local repo and its upstream remote repo
git config --local --bool core.bare false
git config --local remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
git fetch origin
git branch -u origin/master master
# reset the index (not the working tree)
git reset HEAD -- .
Но я реконпринятое решение (сполезныйgit reset
step added отADTC) проще.
.git
Error: User Rate Limit Exceededgit clone --no-checkout
Error: User Rate Limit Exceeded.git
Error: User Rate Limit Exceeded.git
Error: User Rate Limit Exceededgithub.com/VonC/compileEverything/blob/…
.git
Error: User Rate Limit Exceeded.git
Error: User Rate Limit Exceeded.git
Error: User Rate Limit Exceededgit reset
Error: User Rate Limit Exceededgithub.com/VonC/compileEverything/blob/…Error: User Rate Limit Exceeded
Push-to-Deploy
Вместо того, чтобы преобразовывать пустой пульт дистанционного управления в стандартный репозиторий, вы можете использовать сценарий post-receive в каталоге hooks, чтобы развернуть репозиторий в каталог развертывания.
Вот хороший пример настройки Push-to-Deploy
Для простоты, это пример содержания скрипта из ссылки выше. Он будет развертывать только толчки от "master" перейти в каталог с именем & quot; развернуть & quot; это на том же уровне, что и родительский каталог хранилища:
#!/usr/bin/env ruby
# post-receive
# 1. Read STDIN (Format: "from_commit to_commit branch_name")
from, to, branch = ARGF.read.split " "
# 2. Only deploy if master branch was pushed
if (branch =~ /master$/) == nil
puts "Received branch #{branch}, not deploying."
exit
end
# 3. Copy files to deploy directory
deploy_to_dir = File.expand_path('../deploy')
`GIT_WORK_TREE="#{deploy_to_dir}" git checkout -f master`
puts "DEPLOY: master(#{to}) copied to '#{deploy_to_dir}'"
Есть два отличия, которые отличают репо от обычной папки .git:
core.bare is set to true in config file index file and working tree do not in exist ,Таким образом, вы можете просто переместить ваш репозиторий в подпапку .git новой папки,
mkdir clone
mv bare.git clone/.git
Измените core.bare:
cd clone
git config --local --bool core.bare false
И сгенерируйте индексный файл и рабочее дерево:
git checkout master
рекомендуюgit checkout
скорее, чемgit reset
генерировать файлы, если они случайно введены не в том месте.
расширение рабочего дерева путем преобразования в обычный репозиторий будет проблемой, но вы можете просматривать содержимое чистого репозитория без его преобразования. использованиеgit cat-file -p <commit-sha>
на любом коммите, чтобы увидеть дерево, к которому оно относится. использованиеgit cat-file -p <blob-sha>
чтобы увидеть содержимое файла, на который ссылается BLOB-объект. использованиеgit show <sha>:path
где sha - это либо коммит, либо дерево, чтобы увидеть содержимое BLOB-объекта в path.