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

rip*_*234 281 git

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

$ 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'
Run Code Online (Sandbox Code Playgroud)

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

Set*_*son 479

是的,问题是"裸"没有提交.如果您按顺序创建repos(bare,alice),这只是第一次提交的问题.尝试做:

git push --set-upstream origin master
Run Code Online (Sandbox Code Playgroud)

这只是第一次需要.之后它应该正常工作.

正如克里斯·约翰森指出的那样,如果你的push.default是自定义的,你就不会有这个问题.我喜欢上游/跟踪.

  • 关于"最新版本没有这个问题":即使在最近的版本中,推送的默认值似乎没有从"匹配"改变; 也许你的`〜/ .gitconfig`中的`push.default`设置为`upstream` /`tracking`(或`current`)? (9认同)
  • 尝试`git push origin master:master` 使其明确。如果这不起作用,请检查您所在的分支:`git branch` 也许您还没有进行第一次提交,或者您在 master 以外的分支上进行了该提交。 (4认同)

ser*_*rby 43

如果你:

 git push origin master
Run Code Online (Sandbox Code Playgroud)

它将推向裸机库.

听起来你的alice repo没有正确跟踪.

cat .git/config
Run Code Online (Sandbox Code Playgroud)

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

如果你

 git push -u origin master
Run Code Online (Sandbox Code Playgroud)

您应该开始跟踪该远程和分支.我不确定这个选项是否总是在git中.


php*_*uru 29

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

记得先提交!

/sf/answers/530057671/

如果您尚未提交到本地仓库,则无需推送,但您收到的Git错误消息对您没有多大帮助.

  • 先提交!DOH!谢谢.Git错误消息是垃圾! (10认同)

ebn*_*ter 17

git push --all
Run Code Online (Sandbox Code Playgroud)

是将所有内容推送到新裸存储库的规范方法.

另一种做同样事情的方法是创建一个新的非裸存储库,然后使用它进行裸克隆

git clone --bare
Run Code Online (Sandbox Code Playgroud)

然后用

git remote add origin <new-remote-repo>
Run Code Online (Sandbox Code Playgroud)

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


Chr*_*sen 7

在您的alice存储库中尝试此操作(在推送之前):

git config push.default tracking
Run Code Online (Sandbox Code Playgroud)

或者,将其配置为您的用户的默认设置git config --global ….


git push默认情况下,origin存储库(通常是您从中克隆当前存储库的存储库),但它不默认推送当前分支 - 它默认只推送存储在源存储库和目标存储库中的分支.

push.default配置变量(见的git-配置(1) )控制什么git push时候(存储库名称后,即东西)没有给出任何"的Refspec"参数将推动.默认值给出了上述行为.

以下是可能的值push.default:

  • nothing
    这会强制您提供"refspec".

  • matching(默认值)
    这将推送源存储库和目标存储库中存在的所有分支.
    这完全独立于当前检出的分支.

  • upstream或者tracking
    (两个值的含义相同.后者被弃用以避免与"远程跟踪"分支混淆.前者在1.7.4.2中引入,因此如果使用Git 1.7.3.1则必须使用后者. )
    这些将当前分支推送到由其"上游"配置指定的分支.

  • current
    这会将当前分支推送到目标存储库中的同名分支.

    这两个最后两个对于常见情况最终是相同的(例如,使用origin/master作为其上游的本地主服务器),但是当本地分支与其"上游"分支具有不同的名称时它们是不同的:

    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
    
    Run Code Online (Sandbox Code Playgroud)

    随着push.default等于upstream(或tracking),推送会去origin分支.当它等于current,推会去origin的quickfix分支.

一旦建立,该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
Run Code Online (Sandbox Code Playgroud)

(同样,如果您在1.7.4.2之前仍在使用Git,则需要使用tracking而不是upstream).