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

时间:2015-12-28 16:55:30

标签: java git jgit

如何使用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();    
    }

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

3 个答案:

答案 0 :(得分:2)

这解决了我:

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

答案 1 :(得分:1)

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();

答案 2 :(得分:0)

受到上述人员的启发,我已经解决了它。以下是我的代码:

/**
 * 添加且提交全部
 * 同等于 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();
 }