我有一台服务器,上面有一个用于推送的裸存储库。但是,我的服务器需要拥有 master 分支的工作副本。
我如何获得工作副本,并且只能从裸存储库中获得?
我有一台服务器,上面有一个用于推送的裸存储库。但是,我的服务器需要拥有 master 分支的工作副本。
我如何获得工作副本,并且只能从裸存储库中获得?
您可以简单地将存储库克隆到同一台机器上的另一个目录:
git clone /bare/repo/dir
当前目录将成为您的 repo 的非裸克隆,您将master
自动签出分支。然后根据需要使用常用命令git pull
来更新它。
附带的好处是,这个操作非常有效——如果你指定一个本地目录git clone
,git 将使用硬链接来共享两个 repos 的对象数据库的只读部分。
裸存储库只是工作目录的 .git 目录,以及本地配置文件中的一个条目。我将裸存储库转换为完整存储库的方法是:
.git
并将所有文件从裸存储库中移到那里.git/config
要更改bare = true
为的文件bare = false
.git
您可以在 Windows上的目录上设置隐藏属性,但不能在目录内的文件上设置。
我正在寻找“分离的工作树”方法(如此处所示):
git init --bare
git config core.bare false
git config core.worktree /somewhere/else/
git checkout -f
这对我有用:
git --git-dir=path-to-bare-repo.git --work-tree=path-to-target checkout master .
此命令会将存储库中的所有文件提取到指定的目录path-to-target
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.
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.
您可以为此使用“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