このベアリポジトリにプッシュできないのはなぜですか?


283

このワークフローの何が問題になっているのか説明できますか?

$ 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クローン元のリポジトリに常にプッシュするわけではありませんか?


プッシュするブランチを指定してはいけませんか?
Rekin、2011年

3
クローンの後ではありません!!! 問題が修正された後、それはうまく機能し、ブランチを指定する必要はありません...空のリポジトリのこの最初のチェックアウトだけでこれが発生します...これは非常に迷惑です...彼らはこの問題を修正する必要があります。
ディーン・ヒラー

samranga.blogspot.com/2015/07/…を実行しようとするときに、この投稿が誰かにとって役立つことを願っています。質問 のエラーは、すでにローカルに存在するプロジェクトからgit BitBucketリポジトリを作成しようとしてもポップされる可能性があります
Samithaチャトゥランガ

回答:


483

はい、問題は「裸」でのコミットがないことです。これは、レポジトリを(bare、alice)の順序で作成した場合、最初のコミットでのみ問題になります。やってみてください:

git push --set-upstream origin master

これは初めて必要になるだけです。その後は正常に動作するはずです。

Chris Johnsenが指摘したように、push.defaultがカスタマイズされていれば、この問題は発生しません。私はアップストリーム/トラッキングが好きです。


1
私はやっていてsudo apt-get upgrade git-coresudo apt-get upgrade git更新は必要ないと思います。git --version1.7.3.1を返します。何か足りないアイデアはありますか?私は現在apt-get update、私にはうまくいかないことを認めますが、それはそれほど昔ではありませんでした。
ripper234 2011年

1
@ ripper234:gitの現在のバージョンは1.7.5.3です。不便に耐えるか、別のワークフローを使用するか、debian / ubuntuパッケージなしで最新のgitを手動でインストールできます。
Seth Robertson、

そうですね、ソフトウェアがパッケージ化されるまでには時間がかかることを忘れています。私はLinuxの初心者で、Windowsから来ており、クリックしてここにインストールして、最新バージョンをインストールしています。
ripper234 2011年

9
「最近のバージョンにはこの問題はありません」に関して:最近のバージョンでも、プッシュのデフォルトはから変更されていないようですmatching。多分あなたはあなたの/に(または)にpush.default設定していますか?upstreamtrackingcurrent~/.gitconfig
Chris Johnsen、

4
git push origin master:master明示的にしてください。それがうまくいかない場合は、どのブランチにいるかを確認してください。git branchおそらく、最初のコミットを行っていないか、マスター以外のブランチでそのコミットを行っています。
セスロバートソン

43

もし、あんたが:

 git push origin master

ベアリポジトリにプッシュされます。

アリスレポが正しく追跡していないようです。

cat .git/config

これにより、デフォルトのリモートとブランチが表示されます。

もし、あんたが

 git push -u origin master

そのリモートとブランチの追跡を開始する必要があります。そのオプションが常にgitにあったかどうかはわかりません。


30

この関連する質問の答えは私に解決策を提供しました...それは単なる愚かな間違いでした:

最初にコミットすることを忘れないでください!

https://stackoverflow.com/a/7572252

ローカルリポジトリにまだコミットしていない場合、プッシュするものはありませんが、返されるGitエラーメッセージはあまり役に立ちません。


17
git push --all

すべてを新しいベアリポジトリにプッシュする正規の方法です。

同じことを行う別の方法は、新しい非ベアリポジトリを作成し、次に

git clone --bare

次に使用します

git remote add origin <new-remote-repo>

元の(裸でない)リポジトリ。


...それで答えに反対票を投じましたか?これ、すべてを新しいベアリポジトリにプッシュする標準的な方法です。うまくいかなかった場合は、他にも問題があります。
ebneter、

あなたは正しい、私はおそらく持ってはいけない、あなたがただ助けようとしていたことを知っている。編集すると、反対票が取り消されます。
ripper234

ありがとう、同じタスクを実行する別の方法で編集しました。
ebneter、

あなたの答えは私に感謝しました;)しかし、コマンドの最後では、パスは次のように存在している必要があります:git push --all ../test_repoコマンドの最後にあるリポジトリのURL;)
Metafaniel

@Metafanielそれはあなたがそれをどのように設定したかに依存します。ローカルリポジトリにリモートが適切に設定されている場合、「git push --all」はそのまま動作します。
ebneter 2012

7

aliceリポジトリでこれを試してください(プッシュする前に):

git config push.default tracking

または、それをユーザーのデフォルトとして設定しますgit config --global …


git pushデフォルトではoriginリポジトリ(現在のリポジトリのクローン元のリポジトリ)になりますが、デフォルトでは現在のブランチがプッシュされません。デフォルトでは、ソースリポジトリと宛先リポジトリの両方に存在するブランチのみがプッシュされます。

push.default設定変数(参照はgit-config設定(1)どのようなコントロール)git pushそれはどんな「refspec」の引数(すなわちにリポジトリ名の後に何かを)与えられていないときにプッシュします。デフォルト値は、上記の動作を提供します。

可能な値はpush.default次のとおりです。

  • nothing
    これにより、「refspec」を指定する必要があります。

  • matching(デフォルト)
    これにより、ソースリポジトリと宛先リポジトリの両方に存在するすべてのブランチがプッシュされます。
    これは、現在チェックアウトされているブランチから完全に独立しています。

  • upstreamまたはtracking
    (どちらの値も同じ意味です。後​​者は「リモート追跡」ブランチとの混同を避けるために非推奨になりました。前者は1.7.4.2で導入されたため、Git 1.7.3.1を使用している場合は後者を使用する必要があります。 )
    これらは、現在のブランチを「アップストリーム」構成で指定されたブランチにプッシュします。

  • current
    これにより、現在のブランチが宛先リポジトリの同じ名前のブランチにプッシュされます。

    これらの最後の2つは、一般的なケース(たとえば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
    

    push.defaultに等しいupstream(またはtracking)、プッシュに行くoriginマスターブランチ。と等しい場合current、プッシュはoriginquickfixブランチに移動します。

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)。


1

私はSourceTree gitクライアントを使用していますが、最初のcommit / pushコマンドは次のとおりです。

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v --tags --set-upstream origin master:master
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.