如何将裸git仓库转换为普通仓库(in-place)?

hgtggwj0  于 2023-06-04  发布在  Git
关注(0)|答案(9)|浏览(296)

我有一个空的git仓库,但需要通过ssh访问和浏览它的内容(在像用户体验这样的文件管理器中)。
我想我可以复制它:

git clone -l <path_to_bare_repo> <new_normal_repo>

然而,我的存储库大约有20GB大小,我没有足够的空间来复制它。有没有一种方法可以就地转换裸存储库,使其最终拥有一个工作副本?

v8wbuo2f

v8wbuo2f1#

注意:我在一个 very simple 1-commit repository上测试过。请仔细检查这一点,阅读man pages,并在遵循StackOverflow上的建议之前为您的备份感到高兴。(你会回来的,对吧?))

要将--bare存储库转换为非裸存储库,请执行以下操作:
1.在存储库的顶层创建一个.git文件夹。
1.将存储库管理内容(HEAD branches config description hooks info objects refs等)移动到您刚刚创建的.git中。
1.运行git config --local --bool core.bare false将本地git-repository转换为non-bare。
1.* (通过Tamás Pap的评论)* 在步骤#3之后,您将看到您在分支master(或您的主分支)上,并且所有文件都被删除,并且删除正在进行。这很正常只需手动 checkout master,或执行git reset --hard,就完成了。
1.* (解决Royi报告的问题)* 编辑.git/config文件,在[remote "origin"]部分的url = <...>之后添加行fetch = +refs/heads/*:refs/remotes/origin/*。否则git fetch将看不到origin/master和其他origin的分支。
这些步骤与this question的方向相反,“git-convert normal to bare repository”-特别注意this answer,它指出上述步骤(我假设,无论哪个方向)都与git-clone不同。不知道这是否与你有关,但是你在问题中提到了git clone

r8uurelv

r8uurelv2#

我有一个稍微不同的场景:

解决方案:

  • .git目录中克隆该内容中的裸存储库:

git clone --bare https://github.com/user/project .git

  • 将其标记为非裸回购:

git config --local --bool core.bare false

  • 重置索引(否则,它认为所有内容都已删除,因为.gitbare repo不包括文件' index '。

git reset HEAD -- .
这将恢复.git/index
我已经有效地将一个裸的repo转换为一个非裸的repo,同时保留了我以前得到的内容。
我多年来一直使用的完整脚本包括以下步骤:

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 -- .

但我确实认为accepted solutionhelpful git reset step addedADTC)更简单。

4jb9z9bj

4jb9z9bj3#

最初的问题是没有足够的空间来做简单的事情。对于那些有足够空间的人来说,答案要简单得多:

git clone foo.git foo
dfty9e19

dfty9e194#

要简化和合并答案中的信息,请执行以下操作:
裸仓库与普通的.git文件夹有三个不同之处:

  • 在配置文件中将core.bare设置为true
  • 索引文件和工作树不存在
  • 不生成“origin”远程的默认refspec

因此,您可以简单地将您的裸存储库移动到新文件夹的.git子文件夹中,

mkdir clone
mv bare.git clone/.git

更换核心。裸露:

cd clone
git config --local --bool core.bare false

添加默认原点refspec,使git fetchgit push选择与通常相同的默认值:

git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'

并生成索引文件和工作树:

git checkout master

我建议使用git checkout而不是git reset来生成文件,以防不小心输入到错误的位置。

pcrecxhr

pcrecxhr5#

如果磁盘空间不足,通过转换到普通存储库来扩展工作树将是一个问题,但是您可以浏览裸存储库的内容而无需转换它。在任何提交上使用git cat-file -p <commit-sha>来查看它所引用的树。使用git cat-file -p <blob-sha>查看blob引用的文件的内容。使用git show <sha>:path,其中sha是一个提交或一个树,以查看path处blob的内容。

nwlqm0z1

nwlqm0z16#

cd到裸存储库中并执行
1.或者:

git config core.bare false
git reset --hard

1.或者

git clone X.git X

(will给予你一个名为X的常规git仓库)

fzwojiic

fzwojiic7#

如果你不介意在不同的工作树上工作,那么

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

请注意,这不是克隆。

ctehm74n

ctehm74n8#

即推即用

您可以使用hooks目录中的post-receive脚本将存储库展开到部署目录中,而不是将裸远程存储库转换为标准存储库。
Here is a good example of setting up Push-to-Deploy
为了便于参考,这是上面链接中的脚本内容示例。它只会将来自“master”分支的推送部署到名为“deploy”的目录中,该目录与仓库的父目录处于同一级别:

#!/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}'"
cbeh67ev

cbeh67ev9#

Windows 10的另一个案例

在我的情况下,我甚至不会在另一个路径中初始化任何新的具有工作树的存储库,以便稍后克隆(BARE:main)远程存储库,因为它不是存储库,并且我找不到***.git***文件夹,因为我在运行后无法创建它。

git init

所以我的问题是在***系统环境变量***中,有一个不同的路径关联到我的git。我只需要删除这个变量,然后就可以运行git init

我会附上图片,你可以访问 * 系统环境变量 *

1.去启动windows< windows-key >
1.写入系统
1.按*系统**控制面板 *

1.在 * 关于 * 中,在 * 相关设置 * 下查找 * 高级系统设置 *
1.然后单击***环境变量...***

1.删除与git相关的内容。

相关问题