8

tl;drコマンドラインが正常に動作している間にJGitcheckoutが例外をスローするgit checkout

現在、JGit を使用して、Java でオンライン Git リポジトリから特定のリビジョンをチェックアウトしようとしています (仕事用)。私の現在のアプローチは次のとおりです(そして、私はSVNのバックグラウンドから来たGitに非常に慣れていないため、これは間違っている可能性があります):

  • ハードドライブの一時的な場所にリポジトリをクローンします
  • 必要なリビジョンを見つけます (SHA-1 ハッシュとブランチの名前を使用してみました)
  • そのリビジョンをチェックアウトする
  • そこから、チェックアウトしたファイルをプログラムの後半への入力として使用します。
  • 別のリビジョンをチェックアウトする
  • これらのファイルをプログラムの別の部分への入力として使用する

基本的に、一時フォルダーの内容をどのリビジョンとも交換できるようにしたいと考えています。コマンド ライン インターフェイスを使用するとgit checkout master、and git checkout dylanbranch(dylanbranch は、任意に選択したリビジョンで自分のクローンに作成したブランチです) を使用してこれを行うことができましたが、同じことをしようとした Java コードは失敗します。

Git git = Git.open(new File("checkout")); //checkout is the folder with .git
git.checkout().setName("master").call(); //succeeds
git.checkout().setName("dylanbranch").call(); //fails

そして、コンソールに出力された例外:

Exception in thread "main" org.eclipse.jgit.api.errors.JGitInternalException: Checkout conflict with files: 
src/sizzle
test/qunit
    at org.eclipse.jgit.api.CheckoutCommand.call(CheckoutCommand.java:211)
    at com.avi.scm.git.BranchCheckout.main(BranchCheckout.java:30)
Caused by: org.eclipse.jgit.errors.CheckoutConflictException: Checkout conflict with files: 
src/sizzle
test/qunit
    at org.eclipse.jgit.dircache.DirCacheCheckout.checkout(DirCacheCheckout.java:387)
    at org.eclipse.jgit.api.CheckoutCommand.call(CheckoutCommand.java:162)
    ... 1 more

問題のファイルが削除済みとしてマークされ、コミットのためにステージングされてgit statusいないことを確認できますが、これらの変更が存在する理由はわかりませんが、マスター ブランチに戻るといつでも戻ってきます。それにもかかわらず、コマンド ライン Git を使用して作業ツリーを正常に変更できます。

私の質問:コマンドライン git が機能するのに、なぜこのアプリケーションで JGit が機能しないのですか? その他の役立つ情報は大歓迎です-教えてください:)

更新私はjQueryリポジトリでテストしており、JGitでさらにいくつかの問題に気付きました.「マスター」ブランチで作業しているとき、私はgit status私がいて#On branch master、そこにあると思いますがnothing to commit (working directory clean)、JGitのステータスコマンドを使用するとわかりますそのtest/qunitsrc/sizzleは としてマークされていMissingます。JGit のリセットは何もしないようです。

4

3 に答える 3

2

スタック トレースに記載されている 2 つのディレクトリはGit サブモジュール(test/qunitおよびsrc/sizzle) であり、JGit はまだ完全なサブモジュールをサポートしていないため、これが問題の原因である可能性が最も高いです。

これは、このcommitに基づいて今月予定されている 1.1 JGit リリースでは異なる機能を果たす可能性があります。

JGit サブモジュール サポートの現在の状態について詳しくは、こちらをご覧ください。

于 2011-09-20T21:56:37.823 に答える
0

チェックアウトでも同様の問題が発生しました。Gitでステージングされていないコンテンツでブランチを切り替えることができるという事実は、実際には許容範囲であり、機能ではないと思います。JGitは世界的にGitほど寛容ではないため、通常は多くのケースをテストする必要があります。

(サブモジュールに関連する)直接の問題ではないようですが、より一般的なケースでは、チェックアウトを使用して別のブランチに切り替える前に、変更をコミットする必要があります。

CheckoutCommandは、古いリビジョンから新しいブランチを開始するために完全に機能することに注意してください(ブランチの名前と開始リビジョンを設定する必要があります)。

于 2011-11-17T18:16:00.150 に答える
0

これがあなたの質問に直接答えないことはわかっていますが、Git の Java 実装にも問題がありました。私にとって最も効果的だったのは、単純に Java 実装を捨てて、アプリケーション内から git へのコマンドライン呼び出しを実行することでした。理想的ではないかもしれませんが、コマンドを完全に制御できるため、まさにあなたが望むことを実行できます。

電話するだけ Runtime.getRuntime().exec(...)

ランタイム クラスの Javadoc へのリンク

于 2011-09-16T17:49:54.633 に答える