3

今天我注册了 github,并使用此处描述的技术将现有文件系统转换为 git repo:

http://crashingdaily.wordpress.com/2009/09/02/initing-a-new-remote-git-repository-with-existing-files/

最重要的是(我认为)它涉及到这条线:

git --bare init

然后我按照 github.com 的其余设置教程(这是其中的一部分)完成了。现有的文件系统在 Dropbox 中,所以我在另外两台使用该文件系统的机器(现在是一个 git repo)上执行了相同的设置。

今晚我试图让 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。所以我不能立即明白为什么它甚至无法识别回购。

有接盘侠吗?

编辑 - 为了澄清起见,如果有人可以提出另一个解决方案,那么取消这个 repo 没什么大不了的。我想要一个 git repo 来使用我的 Dropbox 中的文件系统,并且能够通过 Java 提交到 github。

4

4 回答 4

8

对于您的代码,我会说选项 setGitdir() 和 findGitDir() 不应该同时使用。要检索现有存储库,我使用 findGitDir(new File("path/to/my/repo") 就足够了。

于 2011-12-08T18:23:26.743 回答
2

这听起来像是您已将文件添加到裸存储库。不应触及裸存储库,除非通过 git push 和 pull 命令(或一般的 git 命令)。作为指导,我从不查看我的裸存储库。

它应该用作中心位置。一旦你创建了 git bare repo,你应该克隆它,然后从克隆中处理它,从克隆中推拉。

$ 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 存储库而只使用 github。

于 2011-11-22T22:52:50.963 回答
0

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

repository.create();

这相当于“git init”命令。

于 2012-11-01T23:06:15.313 回答
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中找到。

于 2020-01-20T10:56:07.807 回答