2014-02-23 8 views
6

Hier ist die Situation: einige Commits wurden in einem Remote-Repository vorgenommen.Recover nicht referenzierte Commits von Remote-Git-Repository

Leider hat jemand push -f so getan, dass keine Remote-Zweigstelle diese Commits mehr referenziert.

Zu allem Übel, ich habe diese Commits in meinem lokalen Klon nicht.

Mein Ziel ist im Grunde, diese Commits wiederherzustellen. Dies sind einige der Dinge, die ich versucht:

  • git checkout -b recovery <commit_id>: fatal: Referenz ist kein Baum
  • git push origin <commit_id>:recovery

    error: refs/heads/recovery does not point to a valid object! error: unable to push to unqualified destination: recovery The destination refspec neither matches an existing ref on the remote nor begins with refs/, and we are unable to guess a prefix based on the source ref.

The repository is on bitbucket, and the commit is accessible from the web interface, so it hasn't been garbage-collected.

Antwort

1

Das Problem ist, dass Ihr lokales Repository nicht, dass hat id begehen .

git checkout -b recovery <commit_id> 
git push origin <commit_id>:recovery 

Beide Befehle nicht aus diesem Grund habe ich genau die gleichen Nachrichten mit einem GitHub Repo bekommen, wenn ich eine ID begehen verwenden, die nicht lokal vorhanden ist.

Ich dachte, die Antwort einfach sein wird, holen die verlorenen lokal, in einem dieser Wege begeht:

git fetch origin   #1 
git fetch origin SHA1 #2 
git fetch origin SHA1:refs/remotes/origin/recovery #3 

Leider keine dieser Arbeit. Es scheint so zu sein, dass # 2 ab Git v1.4 nach this answer funktioniert. Ab sofort funktioniert es nicht mehr.

Es gibt eine help page for this on GitHub, aber mit keine Antwort, die Sie verwenden können: Es besagt im Grunde, dass wenn Sie das Commit lokal haben Sie einen Zweig von ihm erstellen können und schieben Sie es. Ja, aber wenn du das Commit nicht lokal hast, was dann? Darauf antwortet es nicht.

Ich denke an zwei Optionen können:

  1. einen Mitspieler finden, die diese verpflichten hat. Es ist einfach, mit git log SHA1 zu überprüfen. Wenn jemand es hat, können sie einen Zweig von ihm mit git branch recovery SHA1 erstellen und dann drücken.
  2. Kontakt bitbucket Unterstützung. Da sie das Commit irgendwo haben, sollten sie in der Lage sein, eine recovery Verzweigung für Sie zu erstellen.
3

Wenn Sie den Hash-Wert des begehen, dann können Sie die Sourcen von bitbucket mit einem Link wie folgt herunterladen:

https://bitbucket.org/ownerName/repositoryName/get/A0B1C2D.zip 

Beide .zip und .tar.gz Arbeit.

Dadurch werden die Festschreibung (en) nicht exakt wiederhergestellt, aber zumindest werden Sie die Quellcodeänderungen nicht verlieren. Ich benutzte dies, um einfach ein anderes Commit mit den gleichen Änderungen zu erstellen.

+0

Danke @Wim! Diese Lösung hat für mich funktioniert. – Sergey

0

Es gibt wenig Trick - Sie haben gesagt, Sie haben das Commit in Web-Interface geöffnet. Meine Version des Stash hat die Fähigkeit, ein Tag für dieses Commit zu erstellen. Suchen Sie nach "Keine Tags [+]"