2012-09-07 11 views
5

Ich benutze git auf meinem Windows 7-Rechner, Pushing zu einem freigegebenen Ordner auf einem Server 2008-Rechner. Das hat in den letzten 6 Monaten perfekt funktioniert. Seit gestern kann ich jedoch nicht mehr zum Remote-Repo wechseln. Jedes Mal, wenn ich versuche, erhalte ich folgendes:git push schlägt fehl, wenn ich ein gc auf dem Remote-Repo zuerst

$ git push 
Counting objects: 39, done. 
Delta compression using up to 8 threads. 
Compressing objects: 100% (23/23), done. 
Writing objects: 100% (23/23), 8.42 KiB, done. 
Total 23 (delta 15), reused 0 (delta 0) 
Unpacking objects: 100% (23/23), done. 
error: Couldn't set refs/heads/my-branch 
To //my-server/Code/my-project.git 
! [remote rejected] my-branch -> my-branch (failed to write) 
error: failed to push some refs to '//my-server/Code/my-project.git 

für das Googeln ‚konnte einige refs schieben‘ Fehler zunächst verschiedene Ergebnisse zu nicht haben gezogen gibt (ich bin auf dem neuesten Stand) und mit nicht das Recht Berechtigungen (Ich habe vollen Zugriff auf alles, und kann Dateien im Remote-Repo über Explorer erstellen/löschen/bearbeiten).

Ich stolperte dann über diesen Blogpost http://henke.ws/post.cfm/error-failed-to-push-some-refs, der erwähnt, dass Sie einige Aufräumbefehle auf dem Remote-Repository ausführen müssen. So lief ich git gc auf dem Remote-Repository:

$ git gc 
Counting objects: 3960, done. 
Compressing objects: 100% (948/948), done. 
Writing objects: 100% (3960/3960), done. 
Total 3960 (delta 2971), reused 3942 (delta 2964) 

Und siehe da, ich kann wieder drücken!

$ git push 
Counting objects: 39, done. 
Delta compression using up to 8 threads. 
Compressing objects: 100% (23/23), done. 
Writing objects: 100% (23/23), 8.42 KiB, done. 
Total 23 (delta 15), reused 0 (delta 0) 
Unpacking objects: 100% (23/23), done. 
To //my-server/Code/my-project.git 
    8153afd..1385d28 my-branch -> my-branch 

Das Problem ist aber, dass ich jetzt jedesmal, wenn ich tun möchte, einen Push einen gc auf der Remote-Repository laufen. Wenn ich das nicht mache, bekomme ich den Fehler "Fehler beim Drücken einiger Refs" erneut.

Also, warum ist mein Repo so kaputt? Wie kann ich das Problem dauerhaft beheben?

+0

Ich bin völlig ahnungslos über Windows, also ist es ein Schuss in die Dunkelheit, aber haben Sie die Berechtigungen auf dem Server überprüft? Wenn Sie die Garbage-Collection ausführen, schreiben Sie Dateien nur mit Ihren Berechtigungen neu. – sudarkoff

+0

hast du versucht mit git push Herkunft

+0

Permissions scheinen wie ein wahrscheinlicher Kandidat, aber ich habe überprüft und doppelt überprüft, sowie entfernt und erneut angewendet Vollzugriff permissiosn, entfernt und erneut angewendet meine Gruppe, etc. –

Antwort

4

Es scheint, dass Sie über eine Windows-Netzwerkfreigabe drängen, im Gegensatz zur Verwendung von ssh oder git-Protokolle. Dies würde bedeuten, dass Ihr lokaler Computer die Dateien auf die Netzwerkfreigabe schreiben muss und daher durch gesperrte Dateien oder Berechtigungsprobleme in Bezug auf diesen Server vereitelt werden könnte.

Wenn Sie einen Zweig verschieben, aktualisiert git nach dem Schreiben der Objekte den Verweis für den Zweig, indem er in die Datei .git/refs/heads/my-branch schreibt. Es scheint, dass die Datei derzeit nicht von Ihrem Client aus beschreibbar ist.

Wenn Sie eine GC ausführen, werden Refs aus losen Dateien im Refs-Verzeichnis gesammelt und in eine Textdatei .git/packed-refs eingefügt, und die einzelnen ref-Dateien werden dann gelöscht.

Meine Theorie ist Ihre Push versagt, wenn der Schiedsrichter auf dem Server als lose Datei vorhanden ist, weil Sie eine vorhandene Datei nicht über die Berechtigungen zu überschreiben, während Sie Berechtigungen tun müssen, um neue Dateien zu erstellen. Nachdem Sie die Refs mit einem GC gepackt haben, existiert die Ref-Datei nicht mehr und Sie können wieder einmal drücken.

Meine vorgeschlagen Korrekturen sind:

  1. Überprüfen Sie, ob Sie die vorhandenen Dateien von Ihnen Client überschreiben können und wenn keine Berechtigungen beheben oder Probleme Dateisperren
  2. Switch den git-Protokoll zu verwenden, dieses Blog wie ein gutes scheint Überblick über Optionen für Fenster http://freshbrewedcode.com/derekgreer/2012/02/19/hosting-a-git-repository-in-windows/

Als letztes Mittel, wenn Sie sich fest mit der gc Option finden, könnten Sie versuchen ‚git Pack-refs -all‘ statt laufen. Es wird schneller als das Problem mit einem GC jedes Mal beheben.

+0

Danke für den Kommentar und die detaillierte Information über was pushing und gc-ing macht. Ich habe alle Berechtigungen für die Dateien entfernt und erneut angewendet und außerdem alle Berechtigungen für die * Freigabe * selbst entfernt und erneut angewendet, und das Problem scheint behoben zu sein. Ich vermute, die Freigabeberechtigungen verursachten das Problem. –

Verwandte Themen