我有一个裸露的git仓库,但需要访问和SSH浏览其内容(比如用户体验一个文件管理器)。
我以为我可以克隆它:
git clone -l <path_to_bare_repo> <new_normal_repo>
然而,我的仓库大约是20GB的规模和我没有空间来复制它。 有没有一种方法,以就地与它的工作副本结束了纯仓库转换?
我有一个裸露的git仓库,但需要访问和SSH浏览其内容(比如用户体验一个文件管理器)。
我以为我可以克隆它:
git clone -l <path_to_bare_repo> <new_normal_repo>
然而,我的仓库大约是20GB的规模和我没有空间来复制它。 有没有一种方法,以就地与它的工作副本结束了纯仓库转换?
注 :我测试了这一个非常简单的 1-提交后仓库里。 仔细检查此,请阅读手册页 ,并且永远幸福你跟随你在计算器上找到的建议之前已经备份。 (你做回了吧?)
于转换--bare
库到非裸:
.git
版本库的顶层文件夹。 HEAD branches config description hooks info objects refs
等)到.git
刚刚创建。 git config --local --bool core.bare false
到本地的Git存储库转换为非裸露。 master
(或任何你的主要分支)和所有的文件被删除,删除正在上演。 这是正常的。 只是手工结帐master
,或者做一个git reset --hard
,和你做。 .git/config
文件中添加线fetch = +refs/heads/*:refs/remotes/origin/*
后url = <...>
在[remote "origin"]
部分。 否则git fetch
将看不到origin/master
及其他来源的分支机构。 这些步骤是在相反的方向这个问题 ,“GIT-转换正常纯仓库” -特别注意该答案 ,其中指出,上述步骤(在,我想,任一方向)是从做不同的 git-clone
。 不知道如果这与你有关的,虽然,但你提到git clone
的问题。
我有一个稍微不同的情景:
解:
.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 )更简单。
为了简化和答案结合信息:
有两点不同,使裸露的回购协议从一个正常的git的文件夹不同:
所以,你可以简单地将你的裸露的回购协议是一个新的文件夹的子文件夹。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
,其中沙要么提交或树看到Blob的内容在路径。
楼主的问题是你没有足够的空间来做事的简单方法。 对于那些确实有足够的空间,答案是简单得多:
git clone foo.git foo
如果你不介意工作在不同的worktree,然后
git worktree add ../repo2
cd ..
git status # now works fine
请注意,这不是克隆。
cd到裸露的回购和做
git config core.bare false
git reset --hard
要么
git clone X.git X
(会给你经常混帐回购协议名为X)
一键部署
而不是裸远程转换成标准库,你可以使用后收到脚本在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}'"