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



我的项目的一些依赖项托管在专用存储库中。它在大多数情况下都有效,但有时当我用git更改当前分支时,会出现以下错误:

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

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

你知道是什么原因造成的以及如何解决吗?

与其他人的回答一样,可以通过删除项目派生数据目录中的Swift包缓存以及~/Library/Caches/org.swift.swiftpm中的全局Swift包管理器缓存来解决此问题。更好的是,只删除受影响的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,这可能是同一个错误,只是带有不同的消息。

我想我可能在这里发现了问题!经过大量挖掘,Xcode和Swift PM似乎有一个使用git@而不是https://的repos错误

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

我通过添加一个全新的第三方依赖关系对此进行了测试git@github.com:jpsim/Yams.git进入我们的项目,并看到org.swift.swiftpm中的缓存更新错误。

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

在XCode和AppCode中出现此问题后;重置包缓存";按钮,并花费了很长时间重新索引整个iOS框架当你删除DerivedData文件夹时,我试图最小化我需要删除的文件夹。

我最终得到了以下结果:一旦你收到错误消息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中,单击File(文件)->软件包->解析包版本
  5. 在AppCode中,单击"工具"->Swift Package Manager->解析依赖项
  6. 关闭并重新打开XCode

至少对我来说就是这样。我想你需要为每一个失败的库项目重复这些步骤。最棒的是:无论我切换分支或依赖版本多少次,我都不需要再这样做了:)

有同样的问题,甚至创建了具有相同内容的新回购,以查看它是否正常工作。最后我找到了一个对我有帮助的解决方案

  1. 从项目中删除包
  2. 关闭Xcode
  3. 清洁SPM-swift package purge-cache
  4. 删除派生数据-rm -rf ~/Library/Developer/Xcode/DerivedData
  5. 打开项目并再次添加包

p。S.不移除DerivedDatapurge-cache不起作用,但可能只需要移除DerivedData就可以解决这个问题。无法重新检查,因为我无法再复制此问题。

UPD:不需要步骤#3。

今天似乎对我有用的东西:

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

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

我制作了一个python脚本来修复这个问题。其想法是获取最新的提交哈希并将其写入Package.resolve,然后为您解析PackageDependencies。

你可以获得下面的脚本,或者从这里下载

# Sometimes Xcode cannot resolve SPM(File -> Packages -> Resolve Package versions) if the dependency url is ssh
# This script is a workaround to resolve package versions.
# Usage:
#     python spmResolve.py
# or
#     python3 spmResolve.py
import os.path
import subprocess
import glob
import json

def main():
package_file = "xcshareddata/swiftpm/Package.resolved"
xcodeproj = glob.glob('*.xcodeproj')
xcworkspace = glob.glob('*.xcworkspace')
spmproj = glob.glob('Package.resolved')
package_resolved = ""
if xcodeproj:
package_resolved = xcodeproj[0] + f"/project.xcworkspace/{package_file}"
elif xcworkspace:
package_resolved = xcworkspace[0] + f"/{package_file}"
elif spmproj:
package_resolved = spmproj[0]
else:
print(f"😱 Cannot find *.xcodeproj, *.xcworkspace or Package.resolved file")
exit(-1)
update_package_resolved(package_resolved)

def update_package_resolved(package_resolved):
if not os.path.exists(package_resolved):
print(f"😱 Package.resolved file doesn't exit: {package_resolved}")
exit(-1)
print(f"Found: {package_resolved}")
f = open(package_resolved)
content = json.load(f)
f.close()
for pin in content["pins"]:
url = pin["location"]
if "branch" in pin["state"]:
branch = pin["state"]["branch"]
commit_hash = get_git_revision_hash(url, branch)
print(f"{url}, {branch}, {commit_hash}")
pin["state"]["revision"] = commit_hash
elif "version" in pin["state"]:
version = pin["state"]["version"]
commit_hash = get_git_revision_by_tag(url, version)
print(f"{url}, {version}, {commit_hash}")
pin["state"]["revision"] = commit_hash
with open(package_resolved, "w") as output:
json.dump(content,  output, indent=4)
# resolve SPM
subprocess.run(['xcodebuild', '-resolvePackageDependencies'])
print('🎉 Well done')

def get_git_revision_hash(url, branch) -> str:
command = f'git ls-remote {url} refs/heads/{branch} | cut -f 1'
return get_git_command_output(command)

def get_git_revision_by_tag(url, version) -> str:
command = f'git ls-remote {url} -t {version} | cut -f 1'
return get_git_command_output(command)

def get_git_command_output(command) -> str:
return subprocess.check_output(command, stderr=subprocess.STDOUT, shell=True).decode('ascii').rstrip()

if __name__ == '__main__':
main()

将脚本与*.xcodeproj*.xcworkspace一起放入xcode项目中。然后运行

python spmResolve.py

python3 spmResolve.py

如果你没有python:

brew install python

我也有同样的错误,但通过https添加了repo。我刚刚删除了~/Library/Caches/org.swift.swiftpm的缓存,看起来它很有效。重置包,清除派生数据没有帮助。

相关内容

  • 没有找到相关文章