44

我有一台服务器,上面有一个用于推送的裸存储库。但是,我的服务器需要拥有 master 分支的工作副本。

我如何获得工作副本,并且只能从裸存储库中获得?

4

8 回答 8

54

您可以简单地将存储库克隆到同一台机器上的另一个目录:

git clone /bare/repo/dir

当前目录将成为您的 repo 的非裸克隆,您将master自动签出分支。然后根据需要使用常用命令git pull来更新它。

附带的好处是,这个操作非常有效——如果你指定一个本地目录git clone,git 将使用硬链接来共享两个 repos 的对象数据库的只读部分。

于 2012-09-16T20:08:51.800 回答
25

裸存储库只是工作目录的 .git 目录,以及本地配置文件中的一个条目。我将裸存储库转换为完整存储库的方法是:

  • 创建一个新的子目录.git并将所有文件从裸存储库中移到那里
  • 编辑.git/config要更改bare = true为的文件bare = false
  • 查看您想要的分支。这会将存储库中的所有文件提取到工作目录中。

.git您可以在 Windows上的目录上设置隐藏属性,但不能在目录内的文件上设置。

于 2016-07-21T06:50:02.030 回答
21

我正在寻找“分离的工作树”方法(如此处所示

git init --bare

git config core.bare false
git config core.worktree /somewhere/else/

git checkout -f
于 2012-09-22T22:39:25.980 回答
7

这对我有用:

git --git-dir=path-to-bare-repo.git --work-tree=path-to-target checkout master .

此命令会将存储库中的所有文件提取到指定的目录path-to-target

于 2020-03-24T16:03:08.463 回答
4

This is a riff off the other 2 answers but it fills the gap for my use case -- it works for updating the repo from the origin and checking out branches and any git operation because you end up with a normal complete git repo.

git clone /path/to/bare/repo /new/path/to/full/repo
cd /new/path/to/full/repo
git remote set-url origin git@github.com:swift/swift.git

After executing these 3 lines of code you can then git pull and git branch and git checkout some_branch and so on because you now have a normal complete git repo connected to your remote repo.

于 2015-12-09T23:23:19.070 回答
3

This is how it works:

$ git init --separate-git-dir /path/to/existing-bare-repository /path/to/workdir
$ cd /path/to/workdir
$ git checkout .

Voilà!

For info: git init will report: Reinitialized existing Git repository in /path/to/existing-bare-repository. But be confident. man git-init says: Running git init in an existing repository is safe. It will not overwrite things that are already there.

The magic is that git init alone does not make your files appear in the working directory. You have to checkout the root directory.

于 2016-04-26T21:31:43.177 回答
2

您可以为此使用“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
于 2012-09-17T15:29:20.630 回答
2

也考虑使用

https://git-scm.com/docs/git-worktree

它应该允许从裸仓库创建本地工作副本,而无需克隆它(如果仓库很大,这可以节省空间)

于 2021-06-26T03:23:45.753 回答