Published

28 March 2015

Tags

Contents

最近有一些需求, 大概就是本地有几个仓库, 需要相互之间 push, pull, 并且希望能够立即同步 到 work directory 下, 于是开始尝试了一发

创建了一个 git 仓库在 ~/p1 下, 然后

    git clone ~/p1 ~/p2

成功了! git 可以 clone 本地仓库, 并且在 ~/p2 目录下也有对应的 origin.

第二个实验就是看看能不能 push 到远程仓库上, ssh 什么都设置好了以后, 在 vps 上通过 git init 创建了一个空的 git 仓库, 尝试能不能吧本地的repo push 上去, remote 的设置命令为 git remote add origin ssh://root@vps.randonl.me/root/test_git,

push 一发尝试了一下, 发现出了问题

    remote: error: refusing to update checked out branch: refs/heads/master
    remote: error: By default, updating the current branch in a non-bare repository
    remote: error: is denied, because it will make the index and work tree inconsistent
    remote: error: with what you pushed, and will require 'git reset --hard' to match
    remote: error: the work tree to HEAD.
    remote: error: 
    remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
    remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
    remote: error: its current branch; however, this is not recommended unless you
    remote: error: arranged to update its work tree to match what you pushed in some
    remote: error: other way.
    remote: error: 
    remote: error: To squelch this message and still keep the default behaviour, set
    remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
    To remote reop

查了一下, 似乎是 git 并不允许 push 到远程正在工作的目录, 这个问题有两种解决方法, 一个就是建立仓库的时候使用 --bare, 这样会导致我们的仓库 没有工作目录, 这不是我们想要的, 于是使用另外一个方案 , 需要修改配置 receive.denyCurrentBranch

这个设置有如下参数:

    receive.denyCurrentBranch
    If set to true or "refuse", git-receive-pack will deny a ref update to the currently checked out branch of a non-bare repository. Such a push is potentially dangerous because it brings the HEAD out of sync with the index and working tree. If set to "warn", print a warning of such a push to stderr, but allow the push to proceed. If set to false or "ignore", allow such pushes with no message. Defaults to "refuse".

我们将它设置为 ignore

push 成功了, 但是发现文件并没有更新, 这是因为我们的 work directory 并没有更改, 我们可以通过 reset HEAD 来同步, 但是这样还不够快, 于是乎我们可以使用这个设置的 另一个选项, 也就是 updateInstead, 通过这个变量就可以直接更新了, 不过很可惜似乎 低版本的 git 不支持这个选项

为了升级到最新的 git 我们需要用 ppa 源

    sudo add-apt-repository ppa:git-core/ppa
    sudo apt-get update
    sudo apt-get upgrade git


blog comments powered by Disqus