如何使用JGIT将带有项目的文件夹添加到repo(在本例中是GitHub repo),而无需克隆等操作?我会用文件夹创建一个本地回购协议,然后将其与远程回购协议合并吗?

我不想克隆的原因是回购协议将变得非常庞大,我不希望克隆需要很长时间.此外,这是在一个插口插件命令中,但我认为这不会改变任何事情.当我运行命令时,它会给我一个错误.

最后一件事是,当我将文件夹复制到repo文件夹时.它只创建了一个名为"Minecraft服务器"的文件夹,其中没有任何文件.我做错了什么?

Folders

源代码:

public class SaveServer implements CommandExecutor {

    private final CrucialPlugin plugin;

    public SaveServer(CrucialPlugin plugin) {
        this.plugin = plugin;
    }


    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {

        if (sender instanceof Player) {
            Player player = (Player) sender;

            if (args.length == 0) {
                player.sendMessage(ChatColor.RED + "You need to enter some arguments");
                player.sendMessage(ChatColor.YELLOW + "To save the server network to the GitHub repo: /saveserver <what you built/did>");
            } else if (args.length == 1) {
                if (plugin.getConfig().getString("Repository URL") != null && plugin.getConfig().getString("GitHub username") != null && plugin.getConfig().getString("GitHub password") != null) {
                    Path repofolder = Path.of("Server Network Repo");
                    File test = new File(String.valueOf(repofolder));
                    if (Files.exists(repofolder)) {
                        test.delete();
                    }
                    player.sendMessage(ChatColor.GREEN + "Saving server with caption: " + args[0] + "...");
                    File curdir = new File(System.getProperty("user.dir"));
                    Path networkFolder = curdir.toPath().getParent();
                    Path finalFolder = Path.of(repofolder + File.separator + "Minecraft Servers");
                    Date date = new Date();
                    char subColon = '\uA789';
                    String filename = date.toString().replace(':', subColon) + "-" + args[0].toUpperCase().replace("_", " ") + ".txt";

                    File txt = new File(networkFolder + File.separator + filename);
                    try {
                        txt.createNewFile();
                        Git.init().setDirectory(new File("Server Network Repo")).call();
                        Git git = Git.open(new File("Server Network Repo"));
                        git.add().addFilepattern(networkFolder.toString()).call();

                        Files.copy(networkFolder, finalFolder, REPLACE_EXISTING);
                        // add remote repo:
                        RemoteAddCommand remoteAddCommand = git.remoteAdd();
                        remoteAddCommand.setName("origin");
                        remoteAddCommand.setUri(new URIish(plugin.getConfig().getString("Repository URL")));
                        remoteAddCommand.call();

                        // push to remote:
                        PushCommand pushCommand = git.push();
                        pushCommand.setCredentialsProvider(new UsernamePasswordCredentialsProvider(plugin.getConfig().getString("GitHub username"), plugin.getConfig().getString("GitHub password")));
                        pushCommand.call();
                    } catch (GitAPIException | IOException | URISyntaxException e) {
                        player.sendMessage(ChatColor.RED + "Unable to retrieve repository.");
                    }
                    player.sendMessage("Filename test: " + filename);
                } else {
                    player.sendMessage(ChatColor.RED + "You need to fill in all the fields under Save Server in the configuration file before you can use this feature.");
                }
            } else {
                player.sendMessage(ChatColor.RED + "Too many arguments");
                player.sendMessage(ChatColor.YELLOW + "To save the server network to the GitHub repo: /saveserver <what you built/did>");
            }
        }
        return true;
    }
}

推荐答案

这个问题似乎可以通过使用浅层克隆和稀疏签出来解决,这是git的特性,允许在不实际提取整个内容和历史的情况下克隆存储库.问题是,截至2022年4月,jGit还没有实现这一功能.因此,根据你的情况,你可能会做出某种妥协:

  • 如果您可以控制执行代码的环境,那么可以try 调用shell命令并调用real git而不是jgit.当然,这会降低解决方案的可移植性,并给环境带来额外的配置负担(期望安装git,期望它的版本正确,期望代码运行时有足够的权限调用系统命令,git身份验证现在在Java代码之外进行,等等).

  • 如果您只想将特定的更新文件推送到主分支的顶部,而不关心git的所有功能,比如分支、扩散和合并,而只是简单地使用一个非常特定的github存储库作为一种配置存储,您有时需要用Java更新它,那么您可能希望完全跳过git,而是使用github REST API.然后,将更新的文件和提交信息(如消息和作者)作为http POST请求发送,并让Github将其转换为提交,其他用户可以在常规git客户端上使用.API有现成的Java包装器,例如this project.当然,如果您碰巧使用了Github,而实际的代码预计将与any git存储库和服务器后端一起使用,那么这种方法将不起作用.它还有一个缺点,就是对API产生了额外的依赖,而API并不像常规git那样稳定,因此Github中的更改更有可能导致某些东西被 destruct .

  • 从另一个Angular 解决问题,并尽量减少存储库的大小.例如,放弃git历史记录,并使每个提交都成为一个修正提交强制,以覆盖上一个提交.可能是git反模式列表中的前10项,并且明显滥用了git的意图,但如果它解决了您的问题,那么一切都是好的.没有解决存储库的问题,因为存储库中充满了大文件,而不仅仅是因为历史悠久.

  • 雇佣一个团队,解决this和/或this个问题.很多人都会受益,所以这是一个道德 Select .就我所知,没有任何负面影响;).

Java相关问答推荐

Annotation @ Memphier无法正常工作,并表示:class需要一个bean,但找到了2个bean:

如何在SystemiccationRetryListenerSupport中获得类级别的spring retryable annotation中指定的标签?

如何粘合(合并)文件Lucene?

尽管类型擦除,instanceof与泛型在Java中如何工作?

多个Java线程和TreeMap.put()的非预期行为

在for—each循环中的AnimationTimer中的if语句'

Kubernetes的Java客户端检索状态.处于终止状态的Pod的阶段';正在运行';

Java Swing:初始化身份验证类后未检测到ATM_Interface键事件

计算两个浮点数之间的距离是否对称?

Java-动态绑定-问题-了解

在Spring Boot中使用咖啡因进行缓存

控制器建议异常处理

基于距离的APACHE POI公式判断

如何在特定关键字后提取与模式匹配的多个值?

如何在Selenium上继续使用最新的WebDriver版本

javax.crypto-密码对象-提供者服务是如何工作的?

将Optionals/null安全添加到嵌套的flatMap/流

@此处不能应用可为null的批注

using case default on switch语句返回;预览特征切换中的模式匹配仅在源级别20及以上的情况下可用;

类型安全:从 JSONArray 到 ArrayList> 的未经判断的转换