为什么我不能推到这个裸库?

你能解释一下这个工作流有什么问题吗?

$ git init --bare bare
Initialized empty Git repository in /work/fun/git_experiments/bare/
$ git clone bare alice
Cloning into alice...
done.
warning: You appear to have cloned an empty repository.
$ cd alice/
$ touch a
$ git add a
$ git commit -m "Added a"
[master (root-commit) 70d52d4] Added a
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 a
$ git push
No refs in common and none specified; doing nothing.
Perhaps you should specify a branch such as 'master'.
fatal: The remote end hung up unexpectedly
error: failed to push some refs to '/work/fun/git_experiments/bare'

git push不总是推到我克隆的存储库吗?

190325 次浏览

是的,问题是在“bare”中没有提交。如果你在顺序(bare,alice)中创建repo,这是第一次提交时才会出现的问题。试着做:

git push --set-upstream origin master

只有第一次才需要这样做。之后就可以正常工作了。

正如Chris Johnsen指出的,如果你的push.default是定制的,你就不会有这个问题。我喜欢上游/跟踪。

如果你:

 git push origin master

它将推到裸回购。

听起来你的爱丽丝回购没有正确跟踪。

cat .git/config

这将显示默认的远程和分支。

如果你

 git push -u origin master

你应该开始追踪遥控器和分支。我不确定git中是否一直有这个选项。

git push --all

是将所有内容推到新的裸存储库的规范方式。

另一种方法是创建新的非裸库,然后使用

git clone --bare

然后使用

git remote add origin <new-remote-repo>

在原始(非裸)存储库中。

在你的alice存储库中尝试这一点(在推送之前):

git config push.default tracking

或者,使用git config --global …将其配置为用户的默认值。


git push默认是origin存储库(它通常是你克隆当前存储库的存储库),但它默认不推送当前分支——它默认只推送源存储库和目标存储库中同时存在的分支。

push.default配置变量(参见< em > git-config (1) < / em >)控制在没有给定任何“refspec”参数(即存储库名称后面的内容)时git push将推送什么。默认值提供上述行为。

下面是push.default的可能值:

    <李> < p > nothing < br > 这迫使你提供一个“refspec”。

  • matching(默认值)
    这将推送源存储库和目标存储库中都存在的所有分支

  • upstreamtracking
    (两个值的意思是一样的。后者已弃用,以避免与“远程跟踪”分支混淆。前者是在1.7.4.2中引入的,因此如果您使用Git 1.7.3.1,则必须使用后者。 它们将当前分支推到由其“上游”配置指定的分支。李< / p > < / > <李> < p > current < br > 这将把当前分支推到目标存储库中同名的分支。< / p >

    对于一般情况下,后两者最终是相同的(例如,在使用来源/主作为上游的本地上工作),但当本地分支与“上游”分支具有不同的名称时,它们是不同的:

    git checkout master
    # hack, commit, hack, commit
    
    
    # bug report comes in, we want a fix on master without the above commits
    
    
    git checkout -b quickfix origin/master  # "upstream" is master on origin
    # fix, commit
    git push
    

    如果push.default等于upstream(或tracking),则该推操作将被推到origin分支。当它等于current时,该推操作将被推到origin快速修复分支

matching设置将在你的场景中更新bare。要建立它,你可以使用git push origin master一次。

然而,upstream设置(或者current)似乎与你期望发生的情况更匹配,所以你可能想尝试一下:

# try it once (in Git 1.7.2 and later)
git -c push.default=upstream push


# configure it for only this repository
git config push.default upstream


# configure it for all repositories that do not override it themselves
git config --global push.default upstream

(同样,如果你仍然在使用1.7.4.2之前的Git,你将需要使用tracking而不是upstream)。

这个相关问题的答案为我提供了解决方案…这只是一个愚蠢的错误:

记得先提交!

https://stackoverflow.com/a/7572252 < a href = " https://stackoverflow.com/a/7572252 " > < / >

如果您还没有提交到本地回购,则没有什么可推的,但是您返回的Git错误消息对您没有太大帮助。

我使用SourceTree git客户端,我看到他们的初始提交/推送命令是:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v --tags --set-upstream origin master:master