20

jGitでレポを複製するために多くの方法を試しました(動作します)。次に、リポジトリにいくつかのアーカイブを書き込み、すべてを追加しようとしました(a git add *git add -Aまたはそれに似たもの)..しかし、機能しません。シンプルなファイルはステージング領域に追加されません。

私のコードは次のようなものです:

    FileRepositoryBuilder builder = new FileRepositoryBuilder();
    Repository repository = builder.setGitDir(new File(folder))
            .readEnvironment().findGitDir().setup().build();
    CloneCommand clone = Git.cloneRepository();
    clone.setBare(false).setCloneAllBranches(true);
    clone.setDirectory(f).setURI("git@192.168.2.43:test.git");
    try {
        clone.call();
    } catch (GitAPIException e) {
        e.printStackTrace();
    }
    Files.write("testing it...", new File(folder + "/test2.txt"),
            Charsets.UTF_8);
    Git g = new Git(repository);
    g.add().addFilepattern("*").call();

私は何を間違っていますか?ありがとう。


addFilePattern(".") で何を試しているときに例外が発生しました:

Exception in thread "main" org.eclipse.jgit.errors.NoWorkTreeException: Bare Repository has neither a working tree, nor an index
    at org.eclipse.jgit.lib.Repository.getIndexFile(Repository.java:850)
    at org.eclipse.jgit.dircache.DirCache.lock(DirCache.java:264)
    at org.eclipse.jgit.lib.Repository.lockDirCache(Repository.java:906)
    at org.eclipse.jgit.api.AddCommand.call(AddCommand.java:138)
    at net.ciphersec.git.GitTests.main(GitTests.java:110)
4

3 に答える 3

24

これをデバッグする簡単な方法の 1 つは、JGit リポジトリでAddCommandテストを確認することです。AddCommandTest.java

すべてのファイルを追加するために、パターン " *" は使用されていませんが、" ." は使用されていることがわかります。
そして、それは...という名前のテスト関数で使用されます... testAddWholeRepo()(!)

git.add().addFilepattern(".").call();

例外:

Exception in thread "main" org.eclipse.jgit.errors.NoWorkTreeException: 
Bare Repository has neither a working tree, nor an index

は非常に明示的です。裸でないレポにファイルを追加する必要があります。

テスト方法testCloneRepository()を参照して、独自のクローンと比較し、違いがあるかどうかを確認してください。

于 2012-10-04T20:32:06.510 に答える
12

ファイル f1 を現在のディレクトリから「temp」という別のディレクトリに移動しなければならない状況がありました。ファイルを移動した後、 git.add().addFilePattern(".").call() を呼び出すと、git status が次の結果をもたらしたため、奇妙な動作をしました。

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   temp/f1.html

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    deleted:    f1.html

新しいファイル temp/f1 が作成されたことを認識しましたが、ファイルが最初に削除されたことを検出しませんでした。これはおそらく、ファイルの移動が次のように表示されるためです。

  • ファイルの削除・切り取り f1
  • temp という名前のフォルダーを作成する
  • ファイル f1 の作成/貼り付け

その後、setUpdate(true)既に追跡されているファイルの更新を検索し、新しいファイルをステージングしない に出会いました。(詳細については、java-doc を確認してください)

そのため、git が追加されたファイルと変更されたファイル (削除を含む) の両方を認識できるように、コードを次のように 2 行に変更する必要がありました。

git.add().addFilepattern(".").call();
git.add().setUpdate(true).addFilepattern(".").call();

git status で期待どおりの結果が得られるようになりました。

renamed:    f1.hml -> temp/f1.html
于 2016-11-16T00:50:51.230 に答える
1

ワイルドカードの可能性があります。 add コマンドの javadoc を読んだところ、ワイルドカードではなく、その内容を追加するためにディレクトリの名前を送信したようです。

addFilepattern

public AddCommand addFilepattern(String filepattern)

パラメータ: filepattern- コンテンツを追加するファイル。また、先頭のディレクトリ名 (追加する dirdir/file1や などdir/file2) を指定して、ディレクトリ内のすべてのファイルを再帰的に追加することもできます。ファイルグロブ (例: *.c) はまだサポートされていません。

于 2016-06-16T14:21:41.490 に答える