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 push
immer in das Repository verschoben, aus dem ich geklont habe?
Antworten:
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:
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.
quelle
sudo apt-get upgrade git-core
undsudo apt-get upgrade git
und es denke, dass kein Update notwendig ist.git --version
gibt 1.7.3.1 zurück. Irgendeine Idee, was fehlt? Ich gebe zu, dass es derzeitapt-get update
bei mir nicht funktioniert, aber es ist noch nicht lange her.matching
. Vielleicht haben Siepush.default
aufupstream
/tracking
(odercurrent
) in Ihrem~/.gitconfig
?git push origin master:master
es explizit zu machen. Wenn dies nicht funktioniert, überprüfen Sie, in welchem Zweig Sie sich befinden:git branch
Möglicherweise haben Sie das erste Commit nicht durchgeführt, oder Sie haben dieses Commit für einen anderen Zweig als den Master durchgeführt.Wenn du:
es wird zum nackten Repo schieben.
Es hört sich so an, als würde Ihr Alice Repo nicht richtig nachverfolgen.
Dies zeigt die Standardfernbedienung und den Standardzweig an.
Wenn du
Sie sollten damit beginnen, diese Fernbedienung und den Zweig zu verfolgen. Ich bin mir nicht sicher, ob diese Option schon immer in git war.
quelle
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.
quelle
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
dann benutze
im ursprünglichen (nicht nackten) Repository.
quelle
git push --all ../test_repo
die URL desVersuchen Sie dies in Ihrem
alice
Repository (vor dem Push):Oder konfigurieren Sie es als Standard für Ihren Benutzer mit
git config --global …
.git push
Standardmäßig wird dasorigin
Repository 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.default
Konfigurationsvariable (siehe git-config (1) ) steuert, wasgit push
gepusht 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.
upstream
odertracking
(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:
Mit
push.default
gleichupstream
(odertracking
), würden die Push gehenorigin
‚s Master - Zweig. Wenn es gleichcurrent
, würde die Push gehenorigin
‚s quickfix Zweig.Die
matching
Einstellung aktualisiertbare
den Master in Ihrem Szenario, sobald er eingerichtet wurde. Um es zu etablieren, können Siegit push origin master
einmal verwenden.Die
upstream
Einstellung (oder vielleichtcurrent
) scheint jedoch besser zu dem zu passen, was Sie erwarten, also möchten Sie es vielleicht versuchen:(Wenn Sie vor 1.7.4.2 noch ein Git verwenden, müssen Sie
tracking
stattdessen verwendenupstream
).quelle
Ich verwende den SourceTree Git-Client und sehe, dass der anfängliche Commit / Push-Befehl lautet:
quelle