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

kmb7vmvb  于 2022-11-18  发布在  其他
关注(0)|答案(5)|浏览(276)

我的项目的一些依赖项被托管在一个私有仓库中,它在大多数时候都能正常工作,但有时当我用git修改当前分支时,我会收到这样的错误:

❌ git@my_private_repo.git: An unknown error occurred. reference 'refs/remotes/origin/main' not found (-1)

从这一点上,它是不可能编译和我唯一的选择是重置SPM缓存,这需要很多时间。
有什么想法是什么原因造成的,如何解决它?

aor9mmx1

aor9mmx11#

我想我可能已经发现了这里的问题!经过大量的挖掘,似乎Xcode和Swift PM有一个错误,使用git@而不是https://的repos
使用ssh时,我们会在缓存和派生数据中得到一个挂起的remote/origin/main引用。当使用https时,情况就不是这样了。这是有意义的,因为我们项目中唯一使用ssh的dep是我们的内部dep。
我通过在我们的项目中添加一个全新的第三方依赖项git@github.com:jpsim/Yams.git进行了测试,发现org.swift.swiftpm中该高速缓存更新不正确。
更新:10天后,这似乎是沿着的问题。然而,即使在改变引用,它采取了一个完整的DerivedData/SPM缓存/包。解决擦除之前,Xcode不再有任何参考git@ repos。我已经提交了一个反馈与苹果的这个错误。

tzxcd3kk

tzxcd3kk2#

就像其他人已经回答的那样,这个问题可以通过删除项目的派生数据目录中的Swift包缓存以及~/Library/Caches/org.swift.swiftpm中的全局Swift Package Manager缓存来解决。更好的方法是,只删除受影响的remotes目录,但查找包和文件夹可能会很耗时。
下面是我快速编写的一个小脚本,它将删除全局Swift Package Manager缓存和项目的派生数据存储库目录中所有名为remotes的目录。

#!/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

如果您将代码保存在一个名为fix-spm-cache.sh的文件中,那么您可以执行chmod +x fix-spm-cache.sh,使该文件成为可执行文件。然后,当您在Xcode中遇到错误时,只需运行带有项目名称(如./fix-spm-cache.sh myproject)的脚本。
您可以在运行脚本时保持Xcode打开。一旦脚本完成执行,请尝试再次解析或更新您的软件包。它应该可以工作,并且应该相对较快,因为我们没有删除整个缓存。
这将解决本主题中提到的错误,以及Xcode 13中发生的臭名昭著的SwiftPM.SPMRepositoryError error 5,这可能是同一个错误,只是消息不同。

c9qzyr3d

c9qzyr3d3#

今天我觉得挺管用的:

  • 暂时移除导致问题的相依性
  • 关闭Xcode
  • checkout 包。已解决取消其更改
  • 重新打开Xcode

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

3wabscal

3wabscal4#

有同样的问题,甚至创建了新的回购相同的内容,看看它是工作。最后我找到了一个解决方案,帮助我。
1.从项目中移除包
1.关闭Xcode
1.清洁SPM -swift package purge-cache
1.删除派生数据-rm -rf ~/Library/Developer/Xcode/DerivedData
1.打开项目并再次添加包。
P.S. purge-cache w/o移除DerivedData不起作用,但可能只需要移除DerivedData即可解决此问题。无法重新检查,因为我无法再重现此问题。

**UPD:**不需要步骤#3。

yduiuuwa

yduiuuwa5#

在XCode和AppCode中出现这个问题后,我试图最小化我需要删除的文件夹。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
1.转到以下目录,当然要与您的项目名称匹配:<YourProject>-<RandomCharacters>/SourcePackages/repositories/<FailingLibraryProject>-<RandomCharacters>/refs/
1.删除remotes文件夹
1.在XCode中,单击“文件”-〉“软件包”-〉“解析软件包版本
1.在AppCode中,点击工具-〉Swift软件包管理器-〉解析依赖项。
1.关闭并重新打开XCode
至少对我来说,这就是全部。我想你需要为每一个失败的图书馆项目重复这些步骤。最好的事情是:我再也不需要这样做了,不管我切换了多少次分支或依赖版本:)

相关问题