我有一个服务器,我有一个裸存储库用于推送。但是,我的服务器需要有一个主分支的工作副本。
如何从裸存储库中获取工作副本?
您可以简单地将存储库克隆到同一台机器上的另一个目录:
git clone /bare/repo/dir.git
当前目录将成为您的repo的非裸克隆,您将自动结帐master
分支。然后使用像git pull
这样的常用命令根据需要更新它。
作为附带好处,此操作非常有效 - 如果您为git clone
指定本地目录,git将尝试使用硬链接在这两个repos之间共享对象。
裸存储库只是工作目录的.git目录,是本地配置文件中的条目。我将裸存储库转换为完整存储库所做的是:
.git
并从那里的裸存储库中移动所有文件.git/config
文件以将bare = true
更改为bare = false
您可以在Windows上的.git
目录中设置Hidden属性,但不能在目录中的文件上设置。
我一直在寻找“独立工作树”的方法(如here所见):
git init --bare
git config core.bare false
git config core.worktree /somewhere/else/
git checkout -f
这是另外两个答案的riff,但它填补了我的用例的空白 - 它适用于更新来自原点的repo并检查分支和任何git操作,因为你最终得到一个正常的完整git repo。
git clone /path/to/bare/repo /new/path/to/full/repo
cd /new/path/to/full/repo
git remote set-url origin [email protected]:swift/swift.git
在执行这3行代码后,您可以使用git pull
和git branch
以及git checkout some_branch
等等,因为您现在有一个连接到远程仓库的正常完整git仓库。
这是它的工作原理:
$ git init --separate-git-dir /path/to/existing-bare-repository /path/to/workdir
$ cd /path/to/workdir
$ git checkout .
有!
有关信息:git init
将报告:Reinitialized existing Git repository in /path/to/existing-bare-repository
。但要自信。 man git-init
说:在现有存储库中运行git init是安全的。它不会覆盖已存在的东西。
奇妙的是,单独的git init
不会使您的文件出现在工作目录中。你必须签出根目录。
你可以使用'git show'。
http://www.kernel.org/pub/software/scm/git/docs/git-show.html
基本上:
git --no-pager --git-dir /path/to/bar/repo.git show branch:path/to/file.txt