Warum kann ich nicht in dieses nackte Repository pushen?

283

Können Sie erklären, was an diesem Workflow 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'

Wird nicht git pushimmer in das Repository verschoben, aus dem ich geklont habe?

ripper234
quelle
Sollten Sie nicht einen Zweig angeben, der gepusht werden soll?
Rekin
3
nicht nach einem Klon !!! Nachdem das Problem behoben wurde, funktioniert es hervorragend und es ist nicht erforderlich, den Zweig anzugeben. Nur beim ersten Auschecken eines leeren Repositorys tritt dies auf, was SEHR SEHR ärgerlich ist. Sie sollten dieses Problem beheben.
Dean Hiller
Hoffe, dieser Beitrag wäre für jemanden nützlich, wenn er versucht, oben zu tun - samranga.blogspot.com/2015/07/… Der Fehler in der Frage kann auch dann auftreten, wenn versucht wird, ein Git-BitBucket-Repository aus einem bereits lokal vorhandenen Projekt
Samitha

Antworten:

483

Ja, das Problem ist, dass es in "bare" keine Commits gibt. Dies ist nur dann ein Problem mit dem ersten Commit, wenn Sie die Repos in der Reihenfolge (bare, alice) erstellen. Versuchen Sie Folgendes:

git push --set-upstream origin master

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

Wie Chris Johnsen betonte, hätten Sie dieses Problem nicht, wenn Ihre push.default angepasst worden wäre. Ich mag Upstream / Tracking.

Seth Robertson
quelle
1
Ich mache sudo apt-get upgrade git-coreund sudo apt-get upgrade gitund es denke, dass kein Update notwendig ist. git --versiongibt 1.7.3.1 zurück. Irgendeine Idee, was fehlt? Ich gebe zu, dass es derzeit apt-get updatebei mir nicht funktioniert, aber es ist noch nicht lange her.
Ripper234
1
@ ripper234: Die aktuelle Version von git ist 1.7.5.3. Sie können entweder mit den Unannehmlichkeiten leben, einen anderen Workflow verwenden oder das neueste Git manuell ohne Debian / Ubuntu-Verpackung installieren.
Seth Robertson
Ah, richtig, ich vergesse, dass es einige Zeit dauert, bis Software gepackt wird. Ich bin ein Linux-Neuling, komme aus Windows und habe hier geklickt, um die neueste Version zu installieren.
Ripper234
9
Zu "Neueste Version hat dieses Problem nicht": Selbst in neueren Versionen scheint sich die Standardeinstellung für Pushs nicht geändert zu haben matching. Vielleicht haben Sie push.defaultauf upstream/ tracking(oder current) in Ihrem ~/.gitconfig?
Chris Johnsen
4
Versuchen Sie git push origin master:masteres explizit zu machen. Wenn dies nicht funktioniert, überprüfen Sie, in welchem ​​Zweig Sie sich befinden: git branchMöglicherweise haben Sie das erste Commit nicht durchgeführt, oder Sie haben dieses Commit für einen anderen Zweig als den Master durchgeführt.
Seth Robertson
43

Wenn du:

 git push origin master

es wird zum nackten Repo schieben.

Es hört sich so an, als würde Ihr Alice Repo nicht richtig nachverfolgen.

cat .git/config

Dies zeigt die Standardfernbedienung und den Standardzweig an.

Wenn du

 git push -u origin master

Sie sollten damit beginnen, diese Fernbedienung und den Zweig zu verfolgen. Ich bin mir nicht sicher, ob diese Option schon immer in git war.

serby
quelle
30

Die Antwort dieser verwandten Frage lieferte die Lösung für mich ... es war nur ein dummer Fehler:

Denken Sie daran, zuerst zu verpflichten!

https://stackoverflow.com/a/7572252

Wenn Sie sich noch nicht zu Ihrem lokalen Repo verpflichtet haben, gibt es nichts zu pushen, aber die Git-Fehlermeldung, die Sie zurückerhalten, hilft Ihnen nicht allzu viel.

Phpguru
quelle
17
git push --all

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

Eine andere Möglichkeit, dasselbe zu tun, besteht darin, ein neues, nicht nacktes Repository zu erstellen und dann einen nackten Klon mit zu erstellen

git clone --bare

dann benutze

git remote add origin <new-remote-repo>

im ursprünglichen (nicht nackten) Repository.

ebneter
quelle
... also hast du die Antwort abgelehnt? Dies ist die Standardmethode, um alles in ein neues, nacktes Repository zu verschieben. Wenn es bei Ihnen nicht funktioniert hat, gibt es ein anderes Problem.
ebneter
Du hast recht, ich hätte es wahrscheinlich nicht tun sollen, ich weiß, du hast nur versucht zu helfen. Wenn Sie es bearbeiten, mache ich meine Ablehnung rückgängig.
Ripper234
Vielen Dank, bearbeitet es auf eine andere Weise, um die gleiche Aufgabe zu erfüllen.
ebneter
Ihre Antwort hat mir geholfen, danke;) Aber am Ende des Befehls muss der Pfad wie folgt vorhanden sein: git push --all ../test_repodie URL des
Repos
@ Metafaniel Das hängt davon ab, wie Sie es eingerichtet haben. Wenn in Ihrem lokalen Repo die Fernbedienung bereits ordnungsgemäß konfiguriert ist, sollte "git push --all" unverändert funktionieren.
ebneter
7

Versuchen Sie dies in Ihrem aliceRepository (vor dem Push):

git config push.default tracking

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


git pushStandardmäßig wird das originRepository verwendet (normalerweise das Repository, aus dem Sie das aktuelle Repository geklont haben), es wird jedoch nicht standardmäßig der aktuelle Zweig verschoben. Standardmäßig werden nur Zweige verschoben, die sowohl im Quell-Repository als auch im Ziel-Repository vorhanden sind.

Die push.defaultKonfigurationsvariable (siehe git-config (1) ) steuert, was git pushgepusht wird, wenn keine "refspec" -Argumente angegeben werden (dh etwas nach einem Repository-Namen). Der Standardwert gibt das oben beschriebene Verhalten an.

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

  • nothing
    Dies zwingt Sie, eine "Referenz" anzugeben.

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

  • upstreamoder tracking
    (Beide Werte bedeuten dasselbe. Letzteres wurde veraltet, um Verwechslungen mit "Remote-Tracking" -Zweigen zu vermeiden. Ersteres wurde in 1.7.4.2 eingeführt, sodass Sie letzteres verwenden müssen, wenn Sie Git 1.7.3.1 verwenden. )
    Diese verschieben den aktuellen Zweig zu dem Zweig, der durch seine "Upstream" -Konfiguration angegeben ist.

  • current
    Dadurch wird der aktuelle Zweig in den gleichnamigen Zweig im Ziel-Repository verschoben.

    Diese beiden letzten sind in häufigen Fällen gleich (z. B. Arbeiten an einem lokalen Master, der Origin / Master als Upstream verwendet), unterscheiden sich jedoch, 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.defaultgleich upstream(oder tracking), würden die Push gehen origin‚s Master - Zweig. Wenn es gleich current, würde die Push gehen origin‚s quickfix Zweig.

Die matchingEinstellung aktualisiert bareden Master in Ihrem Szenario, sobald er eingerichtet wurde. Um es zu etablieren, können Sie git push origin mastereinmal verwenden.

Die upstreamEinstellung (oder vielleicht current) scheint jedoch besser zu dem zu passen, was Sie erwarten, also möchten 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

(Wenn Sie vor 1.7.4.2 noch ein Git verwenden, müssen Sie trackingstattdessen verwenden upstream).

Chris Johnsen
quelle
1

Ich verwende den SourceTree Git-Client und sehe, dass der anfängliche Commit / Push-Befehl lautet:

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