286 Stimmen

Warum kann ich nicht auf dieses bloße Repository pushen?

Können Sie erklären, was an diesem Arbeitsablauf falsch ist?

$ 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'

Tut es nicht git push immer in das Repository pushen, von dem ich geklont habe?

487voto

Seth Robertson Punkte 29071

Ja, das Problem ist, dass es keine Übertragungen in "bare" gibt. Dies ist nur ein Problem mit der ersten Übergabe, wenn Sie die Repos in der Reihenfolge (bare,alice) erstellen. Versuchen Sie es:

git push --set-upstream origin master

Dies wäre nur beim ersten Mal erforderlich. Danach sollte es normal funktionieren.

Wie Chris Johnsen feststellte, würden Sie dieses Problem nicht haben, wenn Ihre push.default angepasst wäre. Ich mag Upstream/Tracking.

42voto

serby Punkte 4077

Wenn Sie:

 git push origin master

wird es in das Bare Repo gepusht.

Es hört sich so an, als ob Ihr Alice Repo nicht korrekt verfolgt wird.

cat .git/config

Dies zeigt die Standard-Remote und den Zweig an.

Wenn Sie

 git push -u origin master

Sie sollten damit beginnen, diese Fernbedienung und diesen Zweig zu verfolgen. Ich bin nicht sicher, ob diese Option schon immer in Git vorhanden war.

32voto

phpguru Punkte 2301

Die Antwort auf diese Frage brachte mir die Lösung... es war nur ein dummer Fehler:

Denken Sie daran, sich zuerst festzulegen!

https://stackoverflow.com/a/7572252

Wenn Sie noch keinen Commit in Ihr lokales Projektarchiv gemacht haben, gibt es nichts zu pushen, aber die Git-Fehlermeldung, die Sie zurückbekommen, hilft Ihnen auch nicht weiter.

19voto

ebneter Punkte 19247
git push --all

ist der kanonische Weg, alles in ein neues Bare Repository zu verschieben.

Eine andere Möglichkeit, dasselbe zu tun, besteht darin, Ihr neues, nicht-bare Repository zu erstellen und dann einen bare clone mit

git clone --bare

dann verwenden Sie

git remote add origin <new-remote-repo>

im ursprünglichen (nicht nackten) Repository.

7voto

Chris Johnsen Punkte 199970

Versuchen Sie dies in Ihrem alice Repository (vor dem Pushen):

git config push.default tracking

Oder Sie konfigurieren es als Standard für Ihren Benutzer mit git config --global … .


git push wird standardmäßig die origin Repository (das normalerweise das Repository ist, aus dem Sie das aktuelle Repository geklont haben), aber standardmäßig wird nicht der aktuelle Zweig gepusht, sondern nur Zweige, die sowohl im Quell- als auch im Ziel-Repository existieren.

Die push.default Konfigurationsvariable (siehe git-config(1) ) steuert, was git push pusht, wenn es keine "refspec"-Argumente (d. h. etwas nach einem Repository-Namen) erhält. Der Standardwert bewirkt das oben beschriebene Verhalten.

Hier sind mögliche Werte für push.default :

  • nothing
    Dadurch sind Sie gezwungen, eine "refspec" anzugeben.

  • matching (der Standard)
    Dies drängt alle Zweige, die sowohl im Quell- als auch im Ziel-Repository vorhanden sind.
    Dies ist völlig unabhängig von dem Zweig, der gerade ausgecheckt wird.

  • upstream o tracking
    (Beide Werte bedeuten das Gleiche. Der letztere wurde veraltet, um Verwechslungen mit "remote-tracking"-Zweigen zu vermeiden. Ersterer wurde in 1.7.4.2 eingeführt, so dass Sie den letzteren Wert verwenden müssen, wenn Sie Git 1.7.3.1 verwenden).
    Diese schieben den aktuellen Zweig auf den Zweig, der durch die "upstream"-Konfiguration festgelegt ist.

  • current
    Dadurch wird der aktuelle Zweig in den gleichnamigen Zweig des Ziel-Repositorys verschoben.

    Die beiden letztgenannten sind in den meisten Fällen identisch (z. B. bei der Arbeit an lokalen Meister die die Ursprung/Master als sein Upstream), aber sie unterscheiden sich, wenn der lokale Zweig einen anderen Namen als sein "Upstream"-Zweig hat:

    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

    Mit push.default gleich upstream (o tracking ), würde der Schub an origin 's Meister Branche. Wenn er gleich ist mit current würde der Schub an origin 's quickfix Zweigstelle.

Die matching Einstellung wird aktualisiert bare 's Meister in Ihrem Szenario, sobald es festgelegt ist. Um sie zu etablieren, könnten Sie Folgendes verwenden git push origin master einmal.

Allerdings ist die upstream Einstellung (oder vielleicht current ) scheint besser zu dem zu passen, was Sie erwarten, also sollten Sie es vielleicht versuchen:

# 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

(Auch hier gilt: Wenn Sie noch ein Git vor 1.7.4.2 verwenden, müssen Sie tracking 代わりに upstream ).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X