如何转换裸git仓库到一个正常的(原地)?如何转换裸git仓库到一个正常的(原地)?(How do

2019-05-14 07:39发布

我有一个裸露的git仓库,但需要访问和SSH浏览其内容(比如用户体验一个文件管理器)。

我以为我可以克隆它:

git clone -l <path_to_bare_repo> <new_normal_repo>

然而,我的仓库大约是20GB的规模和我没有空间来复制它。 有没有一种方法,以就地与它的工作副本结束了纯仓库转换?

Answer 1:

:我测试了这一个非常简单的 1-提交后仓库里。 仔细检查此,请阅读手册页 ,并且永远幸福你跟随你在计算器上找到的建议之前已经备份。 (你做回了吧?)

于转换--bare库到非裸:

  1. 做一个.git版本库的顶层文件夹。
  2. 移动储存库管理的东西( HEAD branches config description hooks info objects refs等)到.git刚刚创建。
  3. 运行git config --local --bool core.bare false到本地的Git存储库转换为非裸露。
  4. (经由评论陶巴氏 )第3步后,你会看到你的分支master (或任何你的主要分支)和所有的文件被删除,删除正在上演。 这是正常的。 只是手工结帐master ,或者做一个git reset --hard ,和你做。
  5. (解决由报告的问题Royi )编辑.git/config文件中添加线fetch = +refs/heads/*:refs/remotes/origin/*url = <...>[remote "origin"]部分。 否则git fetch将看不到origin/master及其他来源的分支机构。

这些步骤是在相反的方向这个问题 ,“GIT-转换正常纯仓库” -特别注意该答案 ,其中指出,上述步骤(在,我想,任一方向)是从做不同的 git-clone 。 不知道如果这与你有关的,虽然,但你提到git clone的问题。



Answer 2:

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

  • 非回购( 通过从GitHub压缩包获得 )
  • 需要恢复从内容完整的回购。

解:

  • 克隆裸露的回购协议中的内容,在.git目录:
    git clone --bare https://github.com/user/project .git
  • 标记为一个非裸露的回购协议:
    git config --local --bool core.bare false
  • 复位指数(否则,它认为一切都已经被删除了,因为.git 回购不包含文件“ index ”)。
    git reset HEAD -- .
    这恢复.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增加的步骤由ADTC )更简单。



Answer 3:

为了简化和答案结合信息:

有两点不同,使裸露的回购协议从一个正常的git的文件夹不同:

  • core.bare设置为true在配置文件
  • 索引文件和工作树不存在中

所以,你可以简单地将你的裸露的回购协议是一个新的文件夹的子文件夹。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生成的文件,以防它被误输进错了地方。



Answer 4:

如果您是低的磁盘空间,通过转换为正常的存储库将是一个问题展开工作树,但你可以浏览裸露的回购协议的内容,无需将其转换。 使用git cat-file -p <commit-sha>上的任何承诺看树它所引用。 使用git cat-file -p <blob-sha>查看由BLOB引用的文件的内容。 使用git show <sha>:path ,其中沙要么提交或树看到Blob的内容在路径。



Answer 5:

楼主的问题是你没有足够的空间来做事的简单方法。 对于那些确实有足够的空间,答案是简单得多:

git clone foo.git foo


Answer 6:

如果你不介意工作在不同的worktree,然后

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

请注意,这不是克隆。



Answer 7:

cd到裸露的回购和做

git config core.bare false

git reset --hard

要么

git clone X.git X (会给你经常混帐回购协议名为X)



Answer 8:

一键部署

而不是裸远程转换成标准库,你可以使用后收到脚本在hooks目录扩充仓库到部署目录。

下面是设置一键部署的一个很好的例子

为了便于参考,这是从上述链接的脚本内容的例子。 这将部署只能从“主人”分支到一个名为“部署”,即在同一水平作为仓库的父目录目录推:

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


文章来源: How do I convert a bare git repository into a normal one (in-place)?
标签: git git-bare