从本地存储库中删除后,JGit 没有删除我的文件

JGit not deleting my file after I deleted from the local repository

如何使用 JGit 删除文件?

我从本地存储库中删除并提交了更改,但 JGit 似乎没有注意到它已被删除。它仍然存在于远程存储库中。

我调用的提交更改的函数:

public void commitChanges(){
    Git git = null;
    try {                   
            git = Git.open(new File("./TestGitRepository/.git") );
        } catch (IOException e1) {
            e1.printStackTrace();
        }

        try {       
            git.add().addFilepattern(".").call();
        } catch (NoFilepatternException e) {
            e.printStackTrace();
        } catch (GitAPIException e) {
            e.printStackTrace();
        }

        // Now, we do the commit with a message
        try {
            RevCommit revCommit= git.commit().setMessage("commit try").call();
        } catch (GitAPIException e) {
            e.printStackTrace();
    } 
    git.getRepository().close();
}

我调用的推送更改的函数:

public void pushLocalChanges(){         
    Repository localRepo = null;
    try {
        localRepo = new FileRepository("./TestGitRepository/.git");
    } catch (IOException e) {
        e.printStackTrace();
    }
    Git git = new Git(localRepo);
    PushCommand push = git.push();
    UsernamePasswordCredentialsProvider user = new UsernamePasswordCredentialsProvider("userName", "password");
    push.setCredentialsProvider(user);
    push.setRemote(REMOTE_URL);
    try {
         push.call();
        System.out.println ("pushed to upstream: "+push.getReceivePack());
    } catch (GitAPIException e) {
        e.printStackTrace();
    }
    git.getRepository().close();    
}

远程存储库上没有任何变化,我错过了什么? 预先感谢您的帮助!

这帮我解决了:

 git.pull();
 git.rm().addFilepattern("fileToDelete").call();
 commitChanges()
 pushLocalChanges()

git.rm().addFilepattern("fileToDelete").call(); 只会删除作为 addFilepattern() 参数明确提到的文件。

理想情况下,它应该自动删除所有已从本地存储库中删除的文件。它可以通过使用 add().setUpdate(true) 来完成,如下所示:-

            git.add().setUpdate(true).addFilepattern(".").call();
            git.commit().setMessage("delete files").call();
            RefSpec spec = new RefSpec("refs/heads/master:refs/remotes/branch1");
            git.push().setRemote("origin").setRefSpecs(spec).call();

受楼上的启发,我已经解决了。以下是我的代码:

/**
 * 添加且提交全部
 * 同等于 git add . && git commit -m 'some msg'
 * @param repoDir 仓库地址
 * @param msg 消息
 */
public static void addAndCommitAll(File repoDir, String msg) throws IOException, GitAPIException {
    try(Git git=Git.open(repoDir)){
        //全部添加, 除了.gitignore文件中指定的
        doAddAll(git);
        //全部提交
        git.commit()
                .setMessage(msg)
                .call();
    }
}

/**
 * 添加全部
 * 相当于 git add .
 * @param repoDir 仓库地址
 */
 public static void addAll(File repoDir) throws IOException, GitAPIException {
     try(Git git=Git.open(repoDir)){
         doAddAll(git);
     }
 }

 private static void doAddAll(Git git) throws GitAPIException {
     //add removed and modified file
     git.add()
             .setUpdate(true)
             .addFilepattern(".")
             .call();
     //add new and modified file
     git.add()
             .addFilepattern(".")
             .call();
 }