We have a SPM Package for building the Firebase SDKs for zip distribution and have an internal CI that pull the project and all dependencies every build.
I did some digging and saw that the SPM git clone intentionally does not do a shallow clone due to the cost of iterative updates.
Do other folks think it would be helpful to have a command line flag to do a shallow clone during a SPM build? I assume it could be a parameter of the
GitRepositoryProvider initializer and used in the
fetch(repository:to:) function, but I'd have to try to implement it first to confirm.
I did a trivial test (outside of SPM) for time and bandwidth required to clone one of our dependencies (
swift-protobuf in this case) and the difference seems non-trivial to me (compounding across multiple builds and a growing number of dependencies):
$ time (git clone https://github.com/apple/swift-protobuf.git deep-clone) Cloning into 'deep-clone'... remote: Enumerating objects: 10, done. remote: Counting objects: 100% (10/10), done. remote: Compressing objects: 100% (9/9), done. remote: Total 18239 (delta 1), reused 4 (delta 1), pack-reused 18229 Receiving objects: 100% (18239/18239), 17.88 MiB | 4.67 MiB/s, done. Resolving deltas: 100% (15037/15037), done. real 0m7.132s user 0m5.793s sys 0m0.379s
$ time (git clone --depth 1 https://github.com/apple/swift-protobuf.git shallow) Cloning into 'shallow'... remote: Enumerating objects: 416, done. remote: Counting objects: 100% (416/416), done. remote: Compressing objects: 100% (380/380), done. remote: Total 416 (delta 151), reused 76 (delta 25), pack-reused 0 Receiving objects: 100% (416/416), 1.01 MiB | 2.78 MiB/s, done. Resolving deltas: 100% (151/151), done. real 0m1.298s user 0m0.207s sys 0m0.159s
Emphasizing two important parts:
real 0m7.132s 17.88 MiB
real 0m1.298s 1.01MiB
The time to clone and data downloaded provides a nice benefit for the one-off builds, and saving bandwidth in the CI system would be a nice improvement by not pulling in data it won't use as well.
If this is something that other folks have interest in (or there's no pushback on it), I'm happy to investigate building the feature locally and doing some proper benchmarks.