jGit - how to add all files to staging area

妖精的绣舞 提交于 2019-11-30 11:25:49
VonC

One easy way to debug this is to look at the tests of the AddCommand in the JGit repo: AddCommandTest.java

You will see that in order to add all files the pattern "*" is never used, but "." is.
And it is used in the test function named... testAddWholeRepo()(!)

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

The Exception:

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

is quite explicit: you need to add file in a non-bare repo.

See test method testCloneRepository() to compare with your own clone, and see if there is any difference.

I had a situation where I had to move a file f1 from the current directory to another directory called 'temp'. After moving the file, calling git.add().addFilePattern(".").call() acted in a weird way since git status gave the following result:

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

It recognized that a new file temp/f1 was created but didn't detect that the file was deleted first. This was perhaps because moving the file can be seen as follows

  • Deleting/Cutting the file f1
  • Creating a folder called temp
  • Creating/Pasting the file f1

Then I came across the setUpdate(true) that looks for updates to files that are already being tracked and will not stage new files. (Check java-doc for more info)

So I had to change my code to two lines like so in order for git to recognize both files added and modified (which includes deletion):

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

git status now gives the expected result:

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

It might be the wildcard, I just read the javadoc for the add command, looks like you send the name of a directory in order to add its contents not a wild card:

addFilepattern

public AddCommand addFilepattern(String filepattern)

Parameters: filepattern - File to add content from. Also a leading directory name (e.g. dir to add dir/file1 and dir/file2) can be given to add all files in the directory, recursively. Fileglobs (e.g. *.c) are not yet supported.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!