更改分支时未找到 SPM 未知错误参考

Xys*_*Xys 31 macos xcode ios swift-package-manager

我的项目的一些依赖项托管在私有存储库上。它在大多数情况下都有效,但有时当我使用 git 更改当前分支时,我会收到此错误:

\n
\xe2\x9d\x8c git@my_private_repo.git: An unknown error occurred. reference \'refs/remotes/origin/main\' not found (-1)\n
Run Code Online (Sandbox Code Playgroud)\n

从那时起,就不可能编译了,我唯一的选择就是重置 SPM 缓存,这需要花费很多时间。

\n

知道造成这种情况的原因以及如何解决吗?

\n

Srđ*_*đan 26

就像其他人回答的那样,可以通过删除项目的派生数据目录中的 Swift 包缓存以及~/Library/Caches/org.swift.swiftpm. 更好的是,仅删除受影响的remotes目录,但查找包和文件夹可能非常耗时。

这是我快速整理的一个小脚本,它将删除remotes全局 Swift Package Manager 缓存和项目的派生数据存储库目录中指定的所有目录。

#!/bin/bash

if [[ $# -eq 0 ]] ; then
    echo 'Please call the script with the name of your project as it appears in the derived data directory. Case-insensitive.'
    echo 'For example: ./fix-spm-cache.sh myproject'
    exit 0
fi

# Delete all directories named "remotes" from the global Swift Package Manager cache.
cd ~/Library/Caches/org.swift.swiftpm/repositories

for i in $(find . -name "remotes" -type d); do
    echo "Deleting $i"
    rm -rf $i
done

# Find derived data directories for all projects matching the script argument, and
# delete all directories named "remotes" from source package repositories cache for those projects. 

cd ~/Library/Developer/Xcode/DerivedData/

for project in $(find . -iname "$1*" -type d -maxdepth 1); do
    for i in $(find "$project/SourcePackages/repositories" -name "remotes" -type d); do
        echo "Deleting $i"
        rm -rf $i
    done
done
Run Code Online (Sandbox Code Playgroud)

如果将代码保存在名为 的文件中fix-spm-cache.sh,则可以chmod +x fix-spm-cache.sh使该文件可执行。./fix-spm-cache.sh myproject之后,当您在 Xcode 中遇到错误时,只需使用项目名称运行脚本即可,例如。

您可以在运行脚本时保持 Xcode 打开。脚本执行完毕后,再次尝试解析或更新您的包。它应该可以工作,并且应该相对较快,因为我们没有删除整个缓存。

这应该可以解决本主题中提到的错误,以及SwiftPM.SPMRepositoryError error 5Xcode 13 中发生的臭名昭著的错误,这可能是相同的错误,只是消息不同。


mrw*_*t09 14

我想我可能在这里找到了问题!经过大量挖掘后,似乎 Xcode 和 Swift PM 在使用 git@ 而不是 https:// 的存储库上存在错误

使用 ssh,我们在缓存和派生数据中获得了对远程/源/主的挂起引用。使用 https 时,情况并非如此。这是有道理的,因为我们项目中使用 ssh 的唯一部门是我们的内部部门。

我通过在我们的项目中添加全新的第 3 方依赖项 git@github.com:jpsim/Yams.git 来测试这一点,并看到 org.swift.swiftpm 中的缓存更新不正确。

更新:10 天后,这似乎一直是问题所在。然而,即使在更改引用之后,在 Xcode 不再有任何对存储git@库的引用之前,也需要完整的 DerivedData/SPM 缓存/Package.resolved 擦除。我已针对此错误向 Apple 提交了反馈。


kal*_*jul 12

在 XCode 和 AppCode 中出现此问题(没有“重置包缓存”按钮,并且在删除 DerivedData 文件夹时需要永远重新索引整个 iOS 框架)之后,我尝试最小化需要删除的文件夹。

我最终得到以下结果:一旦收到错误消息git@library-project.git: An unknown error occurred. reference 'refs/remotes/origin/main' not found (-1),您

  1. 转到您的 DerivedData 文件夹 ( ~/Library/Developer/Xcode/DerivedData/)(对于 AppCode,它位于~/Library/Caches/JetBrains/AppCode2022.2/DerivedData
  2. 当然,转到以下目录,与您的项目名称匹配:<YourProject>-<RandomCharacters>/SourcePackages/repositories/<FailingLibraryProject>-<RandomCharacters>/refs/
  3. 删除remotes文件夹
  4. 在 XCode 中,单击文件 -> 包 -> 解析包版本
  5. 在 AppCode 中,单击“工具”->“Swift 包管理器”->“解决依赖关系”。
  6. 关闭并重新打开 XCode

这就是所需要的一切——至少对我来说是这样。我想您需要对每个失败的图书馆项目重复这些步骤。最好的事情是:无论我切换分支或依赖版本多少次,我都不需要再次执行此操作:)


Xys*_*Xys 3

今天似乎对我有用的东西,只需要几秒钟,并且不会删除派生数据文件夹:

  • 暂时删除导致 Swift 包中出现问题的依赖项
  • 关闭Xcode
  • 签出 Package.resolved 以取消其更改
  • 重新打开 Xcode

几秒钟后,一切似乎又恢复正常了。