gpt4 book ai didi

git - "Unable to determine upstream SVN information from working tree history"

转载 作者:IT王子 更新时间:2023-10-29 00:36:46 26 4
gpt4 key购买 nike

我正在尝试使用 GCC git 镜像,已记录 here .

前段时间,我克隆了 git 仓库:

git clone git://gcc.gnu.org/git/gcc.git

添加了 git-svn 内容:

git svn init -Ttrunk --prefix=origin/ svn+ssh://gcc.gnu.org/svn/gcc

然后 git svn rebasegit svn dcommit 等都运行良好。

几个月后,我在本地 git 分支上完成了各种开发工作,并且开始向上游 SVN 提交更多更改:

  1. 从 git 镜像更新:

    $ git rebase
  2. 确保我拥有来自 SVN 的绝对最新版本,但它不起作用:

    $ git svn rebase -v
    Unable to determine upstream SVN information from working tree history

我以某种方式破坏了元数据!除了上述内容,我认为我在某些时候错误地执行了 git svn fetch,但这应该不会有害,不是吗?

因此,我尝试从远程 git 镜像创建一个新分支:

$ git branch svntrunk remotes/origin/trunk
$ git checkout svntrunk
$ git svn rebase
Unable to determine upstream SVN information from working tree history

网络搜索表明分支历史在某种程度上与 SVN 不同,但我检查了 git log 并且每个提交都有相应的 git-svn-id,这似乎反驳了这一点,不是吗?

因此,我尝试从 git://gcc.gnu.org/git/gcc.git 克隆一个新版本,并且在该存储库中 git svn rebase 工作正常。这两个 repos,其中都有来自同一来源的 git rebase,怎么会有不同的历史?大概他们不能,区别在于本地元数据?

现在,我不想破坏我一直在使用的存储库(尽管我可以),并且将补丁导出到另一个存储库以提交首先破坏了 git-svn 的意义。那么,我该如何修复呢?

最佳答案

你应该可以用移植物来做到这一点。我的理解是,嫁接旨在用于引入遗留存储库。它允许您手动告诉 git 某些引用有一个共同的父级。

如评论中所述,可能有更简单的解决方案。如果所有其他方法都失败了,这将起作用。

您将下 pull 当前的 git 存储库(使用 git 或 git-svn)并将您的旧 git-svn 存储库添加为远程。它们没有关系,所以 gitk 看起来像这样:

unrelated ancestry

我在工作中遇到过一个事件,我们进行了一些文件系统复制而不是 svn 复制,所以我的一些分支名称暗示了这一点。希望这一切都有意义。很幸运,我恰好拥有所有这些图像和故事。有什么机会!?可能还不错,git-svn 很容易混淆。

naming branches

copied_from 分支是他们复制的地方。 graft_ref 是它相遇的地方。他们添加了一堆文件,更改了属性,然后更改了一些文件。有点乱。

总体思路是获取原始来源的索引,但文件内容要匹配修改。所以我们从 ref 分支开始,然后 reset mixed 得到索引。

$ git checkout graft_ref
$ git checkout -b graft_parent
$ git reset --mixed copied_from

reset mixed

如果你在断线时没有在两个分支之间进行更改,那么你应该不必担心这一步。

$ git commit -a -m "svn_branch changes made on svn_trunk filesystem copy"

现在我们需要进行实际的移植。为了便于阅读,我在这里修剪了哈希值。

$ git log -1 --pretty=format:%H graft_ref
631d3c84e35de98236c3d36c08d14ec92f9c62ae
$ git log -1 --pretty=format:%H graft_parent
96a4e87b554e0030035d35ca3aac23e9d71962af
$ echo "631d3... 96a4e8..." > .git/info/grafts

grafted

这看起来与您期望的一样。现在我们只需要将树上的更改 rebase 。我的笔记丢失了,但我想这是我会做的,呵呵。

$ git checkout svn_branch/master
$ git checkout -b consolidate_changes

consolidated

$ git rebase master

rebase

您应该能够将这些更改推送到任何地方。虽然 git 不跟踪移植,因此移植的分支(svn_branch/master 和 friend )将再次中断。除非您再次进行嫁接,否则它实际上是一棵枯树。对于 git-svn,这不是什么大问题,因为您只需提交更改,然后将源作为干净的副本再次 pull 下。

关于git - "Unable to determine upstream SVN information from working tree history",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9805980/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com