git - GitHub自动 merge 后出现 fatal error

标签 git github git-fetch

我在 GitHub 上有一个存储库,位于 here 。我为某人创建了一个工作分支,他们 fork 了存储库,对工作分支进行了一些更改并提交了 pull 请求。

我尝试了这些更改,一切都很好,而且由于 GitHub 提供自动 merge pull 请求的功能,我继续单击绿色的大“merge pull 请求”按钮。一切都很好,除了对工作分支的更改应用于我可以接受的主分支。

现在的问题是我或其他任何人都无法获取存储库。我收到此错误:

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但我仍然收到错误关于错误的引用,我无法找出可以运行来解决问题的任何命令。如有必要,我愿意撤消更改。

如果它有帮助,一旦我克隆了一个不同的分支,这里是 gitbranch -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

最佳答案

新:

显然 1) github 不提供 ssh 访问权限:(,并且 2) 不可能通过 git 协议(protocol)在不同机器之间共享引用日志。

所以...您显然已经创建了一个票证,但您不一定需要它们来修复存储库。您所需要的只是让他们(因为他们具有特权访问权限)在服务器的存储库上运行 git reflog master ,然后粘贴结果供您查看。在该文件中,查找 master 的前一个 SHA-1 值(因为当前的值似乎不起作用)。一旦你有了这个,你(我认为)可以执行以下操作(在你自己的计算机上):

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

这将撤消服务器上的 merge 操作。

您也许能够获取之前工作的 SHA1,而无需从服务器获取引用日志。在您的本地存储库(或您 friend 的本地存储库)中,之前有效的提交确实存在于其中的某个位置。如果您能找到在那里找到它的方法,那么您可以继续执行上述建议。

老:这是我的第一个想法。如果您能够从服务器复制 .git/logs 目录,那么该目录中将存储 master 的所有先前值> 分支机构。具体来说,文件 .git/logs/refs/heads/master 将是一个原始文本文件,其中包含该分支的先前值。例如(我不知道github是否允许你这样做):

$ 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

理论上应该将值更改为 master 之前的值。然而,它只会在本地执行此操作,而不会实际更改服务器上的值,而这正是我们真正需要的。因此,如果您可以直接 ssh 到服务器并在那里运行最后一个命令,那么(理论上)只需撤消 merge 即可永久解决问题。

.

我脑子里能想到的就这些了。但我真的很喜欢解决这样的 git 难题,所以我会让它在我的脑海里停留更长的时间:)

关于git - GitHub自动 merge 后出现 fatal error ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10097069/

相关文章:

使一个分支像另一个分支的 git 命令

git - 如果本地存在分支,我应该在 pull 之前执行 git fetch 吗?

git - .gitconfig 中的 [core] 有什么作用,如何设置?

git - 你什么时候会使用 .git/info/exclude 而不是 ~/.gitignore (core.excludesFile) 来排除文件?

macos - 提交时如何在 vim 中获得 git diff 着色?

git - 在 git 中获取并不能获取所有分支

git - 在 2 个 git 存储库之间同步

git - checkout 新分支后是否需要 `pull`?

Android Gradle 对 fork 的 GitHub 项目的依赖

Github Actions 无法写入文件,权限被拒绝(在 docker 容器内)