jGit - 如何将所有文件添加到暂存区域

2022-09-02 09:23:18

我尝试了很多方法用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)

答案 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() 与您自己的克隆进行比较,看看是否有任何差异。


答案 2

我遇到过这样的情况,我必须将文件f1从当前目录移动到另一个名为“temp”的目录。移动文件后,调用 git.add().addFilePattern(“.”)。call() 以一种奇怪的方式运行,因为 git 状态给出了以下结果:

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

然后,我遇到了寻找已经跟踪的文件的更新,并且不会暂存新文件。(查看 java-doc 了解更多信息)setUpdate(true)

因此,我必须将我的代码更改为两行,以便git能够识别添加和修改的文件(包括删除):

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

git 状态现在给出预期的结果:

renamed:    f1.hml -> temp/f1.html

推荐