1

ここにある GitHub にリポジトリがあります。私は誰かのために作業ブランチを作成し、彼らはレポをフォークし、作業ブランチにいくつかの変更を加え、プル リクエストを送信しました。

変更を試してみたところ、すべて問題なく、GitHub がプル リクエストを自動的にマージすることを提案していたので、先に進んで大きな緑色の [Merge Pull Request] ボタンをクリックしました。作業ブランチへの変更が、私が一緒に暮らすことができるマスターブランチに適用されたことを除いて、すべてが順調でした。

問題は、私や他の誰かがリポジトリを取得できないことです。次のエラーが表示されます。

dp@dpub:/tmp/gh$ git clone git://github.com/dapphp/securimage.git
Initialized empty Git repository in /tmp/gh/securimage/.git/
remote: Counting objects: 333, done.
remote: Compressing objects: 100% (269/269), done.
remote: Total 333 (delta 91), reused 297 (delta 55)
Receiving objects: 100% (333/333), 3.91 MiB | 2.78 MiB/s, done.
Resolving deltas: 100% (91/91), done.
error: refs/remotes/origin/master does not point to a valid object!
error: Trying to write ref refs/heads/master with nonexistant object 31d684d383913c4cf1a0d5ff0691c2c163284a35
fatal: Cannot update the ref 'HEAD'.

これにより、ディレクトリが作成されなかったり、作業ファイルがダウンロードされたりすることはありません。私はこれを解決するための可能な方法を探し回りましたが、ほとんどの場合、そもそもレポのコピーを取得できないため、実行できないコマンドを git レポに発行することについて話しています。

次のような方法でリモート ブランチのクローンを作成できることはわかっていますがgit clone -b audiofixes git://github.com/dapphp/securimage.git、まだ不正な参照に関するエラーが表示され、問題を解決するために実行できるコマンドがわかりません。必要に応じて、変更を元に戻します。

それが役立つ場合、別のブランチを複製すると、次の出力が得られgit branch -aます。

* audiofixes
  remotes/origin/2.0.2
  remotes/origin/3.0
  remotes/origin/HEAD -> origin/master
  remotes/origin/audiofixes
  remotes/origin/securimage_flash

この時点で、リポジトリの状態を修正するために何ができるか (もしあれば) は本当にわかりません。

提案をありがとう。

編集: 要求に応じていくつかのコマンド出力。

$ ls .git/refs/remotes/origin
HEAD

$ ls .git/objects
info/  pack/
# info is empty, pack has pack-b8add06e9a6864ea44a58c06b8bd549eedd90c94.idx and pack-b8add06e9a6864ea44a58c06b8bd549eedd90c94.pack

$ cat .git/refs/remotes/origin/master
cat: .git/refs/remotes/origin/master: No such file or directory

$ cat .git/refs/remotes/origin/HEAD 
ref: refs/remotes/origin/master
4

1 に答える 1

2

新着:

どうやら 1) github は ssh アクセスを許可していません :(、そして 2) git プロトコルを介して異なるマシン間で reflog を共有することは不可能です。

つまり... すでにチケットを作成しているようですが、リポジトリを修正するために必ずしもチケットが必要なわけではありません。必要なのは、それらが (特権アクセスを持っているため)git reflog masterサーバーのリポジトリで実行され、結果を表示できるように貼り付けることだけです。そのファイルで、 master の以前の SHA-1 値を探します (現在の SHA-1 値が機能していないように見えるため)。それができたら、(自分のコンピューターで) 次のことができると思います:

$ git checkout -b temp
$ git update-ref refs/heads/temp $SHA1
$ git push -u origin +temp:master

これにより、サーバーでのマージ操作が取り消されます。

サーバーから reflog を取得しなくても、以前は機能していた SHA1 を取得できる場合があります。ローカル リポジトリ (または友人のローカル リポジトリ) では、以前に機能していたコミットどこかに存在します。そこでそれを見つける方法がわかれば、上記の提案に進むことができます。

OLD: これが私の最初の考えです。サーバーから.git/logsディレクトリをコピーできる場合は、ブランチの以前の値がすべて格納されています。具体的には、ファイルはそのブランチの以前の値を含む生のテキスト ファイルになります。例(githubでこれが許可されているかどうかはわかりません):master.git/logs/refs/heads/master

$ git clone https://github.com/dapphp/securimage.git -b audiofixes
$ scp github.com:/dapphp/securimage.git/logs/refs/heads/master .git/logs/refs/remotes/origin/master
$ git update-ref refs/remotes/origin/master refs/remotes/origin/master@{1} #see "Date Spec" section of http://book.git-scm.com/4_git_treeishes.html

理論的には、以前のマスターの値に変更する必要があります。ただし、それはローカルでのみ行われ、実際にサーバー上の値を変更することはありません。これは本当に必要なものです。したがって、サーバーに直接 SSH で接続し、そこで最後のコマンドを実行することができれば、マージを元に戻すだけで問題を完全に解決できます (これも理論的には)。

.

頭の上で考えられるのはこれだけです。しかし、私はこのような git パズルを解くのが本当に好きなので、もう少し頭の中に置いておきます :)

于 2012-04-10T22:48:17.097 に答える