RoberRed is right that submodules don't resolve transitive version ranges for you. But those ranges are the problem. When two UI libraries share a date utility, a package manager has to run an algorithm to pick one version, and that algorithm is a black box you must trust. Submodules sidestep this entirely: you explicitly pin every dependency to the exact commit your project needs. If a deeper repo moves, the failure is loud and honest, visible in your history, not an indirect dependency silently swapped by a resolver. That explicit, auditable control is what determinism actually means, and a lockfile just approximates it imperfectly.