【问题标题】:JGit checkout over the same branchJGit 在同一分支上结帐
【发布时间】:2023-03-12 20:26:02
【问题描述】:

我需要在使用 JGit 创建的分支上按顺序签出标签。

CheckoutCommand checkout = new Git(testRepository).checkout();

if (!branchExists())
    checkout.setCreateBranch(true).setName("branch-for-test").setStartPoint(key);
else
    checkout.setName(key);

checkout.call();

其中keyString,其中包含我要签出的提交的名称(key 循环更改)。我不想每次结帐时都创建一个分支,因为我不需要。显示以下错误:

org.eclipse.jgit.api.errors.JGitInternalException: Could not rename file target\TestRepository\server\db\scripts\postgresql\._db_script.sql6197897692249726905.tmp to target\TestRepository\server\db\scripts\postgresql\_db_script.sql
        at org.eclipse.jgit.api.CheckoutCommand.call(CheckoutCommand.java:320)

在这发生之前,我试图在 else 语句中使用

checkout.setName("branch-for-test").setStartPoint(key);

它没有抛出任何错误,但也没有检出标签。

【问题讨论】:

  • branchExists() 是做什么的?它是否检查名为branch-for-test的分支是否存在?如果是这样,创建分支可以移到循环之外,对吧?
  • 目的是验证分支是否已经创建,在这种情况下我想在现有的分支中结帐
  • 签出到同一个分支应该可以。您应该找到“无法重命名”异常的原因。您是否在引发异常的行(或之前)设置了断点以查看发生了什么(例如目标文件是否存在等)?
  • 抱歉这么晚才回复。有一个临时文件无法重命名。

标签: java jgit


【解决方案1】:

嗯,似乎在 Windows 中使用 JGit 有时可能会产生与托管文件相关的冲突。我为解决这个反复出现的问题所做的是在每个git checkout <ref_name> 之前执行git clean --force,然后是git reset --hard。这对我来说完全没问题,因为我不需要进行阶段性更改......

问题在于,基本上在使用了一些文件之后(即使是以只读方式),它们被标记为已更改(我用git status 验证了它)。上面解释的解决方案意味着更多的操作,但完全解决了我的问题。

有关更多详细信息,请参阅有关这些操作的 git 文档:

  • Git clean:从工作树中删除未跟踪的文件。
  • Git reset:将当前 HEAD 重置为指定状态。

并使用 JGit 开发这两个动作的适当实现:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 2013-12-18
    • 2016-11-03
    • 1970-01-01
    • 2021-11-05
    相关资源
    最近更新 更多