Many sites host repositories via both git:// for fetch-only anonymous access and ssh:// for push-capable access. The "insteadOf" mechanism makes it straightforward to substitute the push-capable URLs for the pull-only URLs, which proves convenient when the site hosts many repositories using the same URL scheme. However, if you use such a substitution and you cannot use the ssh:// URLs (either because you don't have SSH access or you don't have permission to a particular repository), you cannot clone or fetch either, even though you could do so via the git:// URLs. A situation like this arises when sharing git configuration files between systems, of which only a few have SSH access to repositories. "pushurl" provides a way to specify URLs used only for push, but this requires configuring a pushurl for each such repository. As in the rationale for insteadOf, it makes sense to configure this for all repositories hosted on a given system at once. This patch series adds a new "pushInsteadOf" option to go with "insteadOf". pushInsteadOf allows systematically rewriting fetch-only URLs to push-capable URLs when used with push. For instance: [url "ssh://example.org/"] pushInsteadOf = "git://example.org/" This will allow clones of "git://example.org/path/to/repo" to subsequently push to "ssh://example.org/path/to/repo", without manually configuring pushurl for that remote. Includes documentation for the new option, bash completion updates, and test cases (both that pushInsteadOf applies to push and that it does *not* apply to fetch). Changes in v2: - Don't add implicit pushurls from pushInsteadOf to remotes with explicit pushurls (suggested by Junio). - Fix pushInsteadOf rewrites to occur before insteadOf rewrites, to avoid basing the pushInsteadOf rewrites on the rewritten URLs. Josh Triplett (2): Wrap rewrite globals in a struct in preparation for adding another set Add url.<base>.pushInsteadOf: URL rewriting for push only Documentation/config.txt | 13 +++++ Documentation/urls.txt | 18 +++++++ contrib/completion/git-completion.bash | 2 +- remote.c | 83 ++++++++++++++++++++------------ t/t5516-fetch-push.sh | 31 ++++++++++++ 5 files changed, 115 insertions(+), 32 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html