2012-03-21 19 views
13

私はGCCのgitミラーを使用しようとしています、hereと書かれています。"作業ツリーの履歴から上流のSVN情報を特定できません"

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リポジトリをクローン化しました。

一部ヶ月後、私は地元のgitのブランチ上のさまざまな開発作業を行ってきた、と私はSVNを上流へより多くの変更をコミットするようになった:Gitのmirorから

  1. 更新:

    $ git rebase 
    
  2. 私はSVNからの絶対的な最新のを持っているが、それは動作しませんを確認します。

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

何とか私はメタデータを壊しました!上記と同様に、間違いなく私はgit svn fetchをやったと思いますが、それは有害ではありませんか?

$ 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ミラーからの新鮮なブランチを作成してみました対応するgit-svn-id、それはそれを反証しているようですね。

したがって、私はgit://gcc.gnu.org/git/gcc.gitの新しいクローンを試しました。そのリポジトリgit svn rebaseはうまくいきます。どのように2つのレポが両方とも同じソースからのgit rebaseを持っていて、異なる歴史を持つことができますか?おそらく彼らはできないでしょうし、違いはローカルのメタデータにありますか?

私は作業していたリポジトリをゴミ箱に入れたくないのですが(私は可能ですが)、パッチを別のリポジトリにエクスポートしてコミットすることは、最初はgit-svnを持っている点を打ち負かしてしまいます。それで、どうすれば修理できますか?

答えて

12

グラフトでこれを行うことができます。レガシーレポジトリの持ち込みに使用するように設計されているグラフトは、私の理解です。それはあなたにを手動で与えることができますいくつかのrefに共通の親があることをgitに伝えます。

コメントに記載されているように、より簡単な解決策があるかもしれません。これは他のすべてが失敗しても機能します。

現在のgit repo(gitまたはgit-svnのいずれか)をプルダウンし、古いgit-svn repoをリモートとして追加します。我々はいくつかのではなく、SVNのコピーのファイルシステムのコピーを行うので、私のブランチ名の一部いたところ、私は仕事で事件があった

unrelated ancestry

:彼らは関連していないだろう、そうgitkは次のようになります。それを暗示する。とにかくそれはすべて意味があることを願っています。私はちょうどこれらすべてのイメージと物語を持っていることが起こったことは大変幸運です。チャンスは何ですか?おそらくかなり良い、git-svnは簡単に混乱します。

naming branches

彼らはどこからコピーcopied_from分岐があります。 graft_refはこれが出会った場所です。彼らはたくさんのファイルを追加し、プロパティを変更して、いくつかのファイルを変更しました。それはちょっと混乱していた。

一般的な考え方は、元のソースのインデックスを取得することですが、ファイルの内容は変更と一致するようにします。だから我々は、refブランチから始めて、次にインデックスを得るために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

。これで、ツリーの上の変更をリベースする必要があります。私のメモはこのために欠けているが、これは私がやったと思う、hehe。

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

consolidated

$ git rebase master 

rebase

あなたはどここれまで、これらの変更をプッシュすることができるはずです。グラフトはgitで追跡されないので、移植されたブランチ(svn_branch/masterとfriends)は再び壊れます。あなたが移植をやり直さない限り、事実上死んだ木です。 git-svnでは、変更をコミットしてから、ソースをクリーンコピーとして再度プルするので、これは大きな問題ではありません。

+0

+1、非常に良い答え(あなたのブログの投稿から、多分...?)。私はそれが解決された問題に直接適用できるかどうかはわかりませんが(単純な解決策が最も適切かもしれません)、整合性の取れない状態でリポジトリ全体に変更を適用するための適用可能で有用な手順として、私は完全に承認します。 :) – MrGomez

+1

@MrGomezもっと簡単な解決策があることを願っています。 :)他のすべてが失敗する、私はかなり動作すると確信しています。 –

+0

それで、本質的に、私は新鮮なレポから始まり、トピックポイントをグラフトを介して右のポイントで壊れていないgit-svn履歴に挿入し、リベースを使ってグラフトを廃止する。私はスティックの右端を手に入れましたか? – ams

3

これはかなり一般的なシナリオです。私も、古いGitリポジトリとSVNでバックアップされたデータストアを同期させようとしているときにこれを実行しています。

秘密は、SVNをGitの作業マスターブランチと一致させることです。これを行う一般的なコマンドは、前述のように、git svn rebase(変更を元に戻してSVNに同期する)とgit reset --hard(内部インデックスが矛盾した状態のときに以前のリビジョンにハードロールバックを実行する)です。私にとっては、この手続きを根絶するために大量の検索が必要でした。

これは、Gitが同じ作業ブランチに対して複数の変更履歴を同時に管理するときにGitが深刻に混乱する原因となるため、デフォルトではHEADである必要があります。 Gitが調整できない上流のSVNリポジトリと下流の変更履歴で何かが変更されると、その場所が失われ、上記のエラーがスローされます。

この問題は、さらにhereに解決されます。上の答えで述べたように、gitのバージョンをアップグレードする必要がある可能性を排除して、推奨された修正を試みることが望ましいでしょう。

+0

ありがとう、私はその質問を見ましたが、私はgitバージョン1.7.0.4を持っているので、私の問題は解決しませんでした。だから、私が何らかの方法で枝を転がすと、魔法のように再び働き始めるかもしれないと思いますか? – ams

+0

@amsそれは、少なくとも私のためにやった!自分のリポジトリにこのソリューションが見つかる前に、Googleクエリが無駄になってから約3日間はかかりました。私の場合は、Gitの変更を、作業ファイル内、ダウンストリームリポジトリ内、およびSVN内で三方向的にコミットしていました。それは1ビットが好きではなかった。 – MrGomez

+0

@amsまた、これらの提案を参照してください:http://stackoverflow.com/questions/3095611/git-svn-dcommit-error-unable-to-determine-upstream-svn-information – MrGomez

2

最も簡単なことは、git svn fetchを実行することです。既存のgitリポジトリをsvnに再接続すると、git svn rebaseのような理由でこのエラーが発生することはありません。根本的な問題は、あなたがきれいなsvnクローンから始まらなければ、git-svnが常に保持していないレポの状態を前提にしていることです。

次のオプションは、マスターgit branch master-bkpをバックアップすることです。そして、git reset --hard <way-back>を実行します。次にgit svn rebaseを実行します。

gitリポジトリで作業している場合に限り、通常の方法でsvnに接続することはできません。移植することはできます。移植は巧妙で複雑ですが、可能です。また、正しいことをするのは難しく、ねじれやすく、非常にという時間がかかります。最初のオプションとしてお勧めしません。

関連する問題