我尝试了很多方法用jGit克隆一个repo(它有效)。
然后,我在存储库中编写了一些存档,并尝试添加所有存档(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)
答案 0 :(得分:19)
调试此方法的一种简单方法是查看AddCommand中JGit repo的AddCommandTest.java
测试:testAddWholeRepo()
您会看到,为了添加所有文件,从不使用“*
”模式,但“.
”是。
它用于名为... test method testCloneRepository()
(!)
git.add().addFilepattern(".").call();
例外:
Exception in thread "main" org.eclipse.jgit.errors.NoWorkTreeException:
Bare Repository has neither a working tree, nor an index
非常明确:您需要在非裸仓库中添加文件。
请参阅{{3}}与您自己的克隆进行比较,看看是否存在差异。
答案 1 :(得分:3)
我遇到的情况是我必须将文件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,但没有检测到该文件是先被删除的。这可能是因为移动文件可以看作如下
然后我遇到了setUpdate(true)
,它查找已经被跟踪的文件的更新,并且不会播放新文件。 (查看java-doc了解更多信息)
因此我必须将代码更改为两行,以便git识别添加和修改的文件(包括删除):
git.add().addFilepattern(".").call();
git.add().setUpdate(true).addFilepattern(".").call();
git status现在给出了预期的结果:
renamed: f1.hml -> temp/f1.html
答案 2 :(得分:1)
它可能是通配符,我只是读取了add命令的javadoc,看起来你发送了一个目录的名称,以便添加它的内容而不是外卡:
addFilepattern
public AddCommand addFilepattern(String filepattern)
参数:filepattern
- 用于添加内容的文件。 也是一个领先的目录
可以添加名称(例如,添加dir/file1
和dir/file2
的目录)以添加全部
目录中的文件,递归。 Fileglobs(例如*.c
)尚未发布
支持。