Generally for larger scale environments, or multiple environments I have seen this primarily done through CI/CD (whichever particular tool you use).
As an example, I can have 3 flows, with 3 branches (dev, test, stage).
On each merge action in their respective branch, I fire a pipeline that runs a deployment.py which updates whatever changes I might have made to the deployment, and uses the environment variables of the branch to determine what / where to apply it to (so dev branch gets dev labels, and goes to the dev worker pool for agent pick up).
If just the flow changes, and it’s source controlled, the flow doesn’t need to be re-registered, you just pull it down using your preferred blocks (github, S3, azure, etc.)
Another case is you store the code in the image. This could go in a variety of ways depending on the dynamism of your code - it could be very straightforward where you re-package the image and run the deployment without making any changes to your deployment whatsoever.
As long as your parameters don’t change, this shouldn’t be an issue at all, although if your parameters do change, you would need to update the deployment to reflect that as well.
In short - you’re right, I do not believe we have a similar feature like pointing to prefect register to a directory, however, due to the way deployments are an aggregate of storage, flow, execution, etc., it’s not really relevant that I’ve seen. You can update and use your latest flow code, without needing to re-apply an entirely new deployment if you handle the location of your code already. If you don’t, and you expect prefect to handle the storage of your code for you (like deployment.apply() pushing your code into a bucket), then you would want to run a deployment for changes, but that’s where I’d expect CI/CD to provide that functionality?