Вопрос по git – Как мне преобразовать пустой git-репозиторий в обычный (на месте)?

64

У меня есть пустой репозиторий git, но мне нужно получить доступ и просмотреть его содержимое по ssh (в файловом менеджере, например, в пользовательском интерфейсе).

Я полагаю, я мог бы клонировать это:

git clone -l <path_to_bare_repo> <new_normal_repo>

Однако размер моего репозитория составляет около 20 ГБ, и у меня нет места для его дублирования. Есть ли способ конвертировать пустой репозиторий на месте, чтобы получить рабочую копию?

В зависимости от того, что вы подразумеваете под «просмотром его содержимого», вы, вероятно, можете делать все, что хотите, в чистом репо, используяgit show а такжеgit cat-file William Pursell
Если ваша файловая система поддерживает жесткие ссылки, и вы клонируете в одну и ту же файловую систему, clone -l не занимает больше места на диске, поскольку жестко связывает все объекты. Однако, как отметили другие, вам понадобится место для оформления заказа. Neil Mayhew
Спасибо за подсказку, полезно. Мне нужно больше файлового менеджера, как опыт, хотя (отредактировал вопрос). nyi
Не проверено, но если вы переместите, поместите содержимое чистого хранилища в.git каталог и установитьbare параметр в конфиге в false, он должен вести себя как обычный репозиторий, где вы можете простоgit checkout чтобы получить ваши файлы. Noufal Ibrahim
Если твойbare репозиторий занимает 20 ГБ дискового пространства, сколько еще потребуется рабочему дереву? Выreally так много места? ADTC

Ваш Ответ

8   ответов
1

git worktree add ../repo2
cd ..
git status # now works fine

Обратите внимание, это не клон.

Error: User Rate Limit Exceeded
0

git config core.bare false

git reset --hard

или же

git clone X.git X (даст вам регулярное Git-репо с именем X)

90

NoteЯ проверил это наvery simple 1-коммитное хранилище. Дважды проверьте это, прочитайтестраницы руководстваи всегда будьте счастливы, что вы сделали резервную копию, прежде чем следовать советам, которые вы нашли в StackOverflow. (Вы делаете резервную копию, верно?)

Чтобы преобразовать--bare хранилище для не голого:

Make a .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 в вопросе.

Error: User Rate Limit Exceeded
5

что не хватает места, чтобы делать вещи простым способом. Для тех, у кого достаточно места, ответ гораздо проще:

git clone foo.git foo
15

a non-repo (get through a tarball from github) the need to restore a full repo from that content.

Решение:

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) проще.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded.gitError: User Rate Limit Exceededgit clone --no-checkoutError: User Rate Limit Exceeded.gitError: User Rate Limit Exceeded.gitError: User Rate Limit Exceededgithub.com/VonC/compileEverything/blob/…
Error: User Rate Limit ExceedednotError: User Rate Limit ExceedednotError: User Rate Limit ExceededdoError: User Rate Limit Exceeded.gitError: User Rate Limit Exceeded.gitError: User Rate Limit Exceeded.gitError: User Rate Limit Exceededgit resetError: User Rate Limit Exceededgithub.com/VonC/compileEverything/blob/…Error: User Rate Limit Exceeded
"I could not have checked out a non-bare repo, as the folder in which I was doing the checkout is not empty."Error: User Rate Limit ExceededPersonally, I would clone to an empty folder and compare the two first (using an external tool). But that's just me.
0

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}'"
9

Есть два отличия, которые отличают репо от обычной папки .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 генерировать файлы, если они случайно введены не в том месте.

6

расширение рабочего дерева путем преобразования в обычный репозиторий будет проблемой, но вы можете просматривать содержимое чистого репозитория без его преобразования. использованиеgit cat-file -p <commit-sha> на любом коммите, чтобы увидеть дерево, к которому оно относится. использованиеgit cat-file -p <blob-sha> чтобы увидеть содержимое файла, на который ссылается BLOB-объект. использованиеgit show <sha>:path где sha - это либо коммит, либо дерево, чтобы увидеть содержимое BLOB-объекта в path.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded nyi

Похожие вопросы