jGit - 如何将所有文件添加到暂存区
Posted
技术标签:
【中文标题】jGit - 如何将所有文件添加到暂存区【英文标题】:jGit - how to add all files to staging area 【发布时间】:2012-09-25 22:21:24 【问题描述】:我尝试了很多方法来用 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)
【问题讨论】:
【参考方案1】:调试此问题的一种简单方法是查看JGit repo 中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
非常明确:您需要在非裸仓库中添加文件。
查看test method testCloneRepository()
与自己的克隆进行比较,看看有什么不同。
【讨论】:
但是我将它克隆为一个非裸存储库...我不明白我应该这样做... 大声笑,它有效。我只是做Git git = cloneCmd.call()
,并使用这个 git 实例来管理这些东西......谢谢@vonc
git.add().addFilepattern(".").call();没有暂存已删除的文件
@swaheed 我明白了,确实:github.com/eclipse/jgit/blob/…
@swaheed git.add().addFilepattern("sub").setUpdate(true).call();
会更好吗? (github.com/eclipse/jgit/blob/…)【参考方案2】:
我遇到了一种情况,我必须将文件 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 已创建,但没有检测到该文件首先被删除。这可能是因为移动文件可以看到如下
删除/剪切文件 f1 创建名为 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
【讨论】:
遇到了完全相同的问题。谢谢! (仍然没有修复..)【参考方案3】:可能是通配符,我刚刚阅读了 add 命令的 javadoc,看起来您发送目录的名称是为了添加其内容而不是通配符:
addFilepattern
public AddCommand addFilepattern(String filepattern)
参数:filepattern
- 从中添加内容的文件。 也是一个领先的目录
可以给出名称(例如添加dir/file1
和dir/file2
的目录)以添加所有
目录中的文件,递归。 Fileglobs(例如*.c
)还没有
支持。
【讨论】:
以上是关于jGit - 如何将所有文件添加到暂存区的主要内容,如果未能解决你的问题,请参考以下文章