使用JGit提交和推送到GitHub - 裸仓库?

3
今天我在github上注册,并使用此处描述的技术将现有文件系统转换为git库:http://crashingdaily.wordpress.com/2009/09/02/initing-a-new-remote-git-repository-with-existing-files/。最重要的是(我认为),它涉及到这一行命令:git --bare init。然后我按照github.com的设置教程进行操作并完成了设置。现有的文件系统位于Dropbox中,因此我在使用文件系统(现在是git库)的其他两台机器上执行了相同的设置。
今晚,我尝试使用JGit添加一个文件、提交它并将其推送。以下是代码片段,直到出现错误:
FileRepositoryBuilder builder = new FileRepositoryBuilder();
        Repository repository = builder.setGitDir(new File("path/to/my/repo"))
          .readEnvironment() // scan environment GIT_* variables
          .findGitDir() // scan up the file system tree
          .build();

    Git git = new Git(repository);
    AddCommand add = git.add();
    try{
        add.addFilepattern("PlayState.as").call();`

这基本上是从JGit教程中直接摘取的。顺便说一下,它在最后引用的那行代码抛出了异常并声明:
org.eclipse.jgit.errors.NoWorkTreeException: Bare Repository has neither a working tree, nor an index
at org.eclipse.jgit.lib.Repository.getIndexFile(Repository.java:838)
at org.eclipse.jgit.lib.Repository.lockDirCache(Repository.java:886)
at org.eclipse.jgit.api.AddCommand.call(AddCommand.java:136)
at flipa.FLIPAGame.writeToFlixel(FLIPAGame.java:77)
at flipa.FLIPAGame.main(FLIPAGame.java:58)

现在,我不是说要否认宣称版本控制的重要性,事实上我并不是版本控制的最好朋友。我知道一个裸仓库指的是只有Git而没有其他文件,但是现在它似乎已经有文件了。我已经通过终端使用git手动添加、提交和推送到Github。所以我不能立即看出为什么它甚至不识别这个仓库。

有人愿意接手吗?

编辑-为了澄清,如果有人可以提出另一种解决方案,删除这个仓库并不是什么大问题。我想要一个Git仓库来使用我的Dropbox文件系统,并能够通过Java提交到Github。

4个回答

8

针对你的代码,我建议不要同时使用setGitdir()和findGitDir()方法。 如果想获取已存在的仓库,只需使用findGitDir(new File("path/to/my/repo"))即可。


2
这是唯一一个真正回答了原始问题的答案。对于我们这些试图在Java中以编程方式管理git存储库的人来说,其他答案实际上并没有解决问题。 - Phil

2
这听起来像是你把文件添加到了一个裸仓库中。裸仓库不应该被操作,除非通过git push和pull命令(或者其他git命令)。作为指南,我从来不会查看我的裸仓库。
它应该被用作中央位置。一旦你创建了git裸仓库,你应该克隆它,然后从克隆版中工作,进行推送和拉取。
$ cd /dropbox/repo
$ git init --bare
$ cd /workdir
$ git clone file:///dropbox/repo
$ add files in here
$ git add .
$ git commit -m "initial version"
$ git push origin master
$ more changes here
$ git add etc.

这与GitHub的区别在于git clone,它来自不同的位置。说实话,除非你有一个非常好的理由需要本地副本,否则我会忘记dropbox repo并使用GitHub。


是的,这是从Dropbox开始,现在想要实际版本控制而不是备份,并试图混合两者的症状。结果非常糟糕。感谢您写出了一篇易读清晰的回复,我今天真的很难研究Git。我会睡一晚上,明天再来攻克它。我会告诉你进展如何的! - mtrc

0

在 .build() 之后,您的第三行代码应该是:

repository.create();

这相当于 "git init" 命令。


0

在您的情况下,由于您正在现有目录中工作,您可能会发现使用Git.open()更方便。

Git git = Git.open(new File(".git"));

System.out.println("Repository: " + git.getRepository().toString());

//Do some git action for instance:
RevCommit rev = git.commit().setAmend(true)
               .setAuthor("me", "me@mail.com")
               .setMessage("Testing commit from jGit").call();

git.close();

来源:Rüdiger Herrmann在Code Affine上撰写的文章。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接