This repository has been archived on 2025-01-19. You can view files and clone it, but cannot push or open issues or pull requests.
oliverdavies.uk-old-sculpin/source/_posts/easier-git-repository-cloning-with-insteadof.md
Oliver Davies 85a10c545b Run prettier on all *.md files
```
prettier '{app,source}/**/**.md' --write
```
2020-03-08 17:57:45 +00:00

84 lines
3.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: Easier Git Repository Cloning with insteadOf
date: 2019-03-07
excerpt:
How to simplify 'git clone' commands by using the insteadOf configuration
option within your .gitconfig file.
tags: [git]
---
When working on client or open source projects, I clone a lot of
[Git](https://git-scm.com) repositories - either from GitHub, GitLab, Bitbucket
or Drupal.org. The standard `git clone` commands though provided by these sites
can be quite verbose with long repository URLs and use a mixture of different
protocols, and Id regularly need to go back to each website and look up the
necessary command every time.
For example, here is the command provided to clone Drupals
[Override Node Options module](https://www.drupal.org/project/override_node_options):
```plain
git clone --branch 8.x-2.x https://git.drupal.org/project/override_node_options.git
```
We can though simplify the command to make it easier and quicker to type, using
a Git configuration option called `insteadOf`.
## What is insteadOf?
From the
[Git documentation](https://git-scm.com/docs/git-config#git-config-urlltbasegtinsteadOf):
> **url.[base].insteadOf:**
>
> Any URL that starts with this value will be rewritten to start, instead, with
> [base]. In cases where some site serves a large number of repositories, and
> serves them with multiple access methods, and some users need to use different
> access methods, this feature allows people to specify any of the equivalent
> URLs and have Git automatically rewrite the URL to the best alternative for
> the particular user, even for a never-before-seen repository on the site. When
> more than one insteadOf strings match a given URL, the longest match is used.
Whilst examples are sparse,
[it seems like](https://stackoverflow.com/questions/1722807/how-to-convert-git-urls-to-http-urls)
insteadOf is used for resolving protocol issues with repository URLs. However,
we can use it to simplify our clone commands, as mentioned above.
## Example: cloning Drupal contrib projects
When working on Drupal core, or on a module, theme or distribution, you need to
have a cloned version of that repository to generate patch files from, and apply
patches to.
Again, here is the provided command to clone the Override Node Options module:
```plain
git clone --branch 8.x-2.x https://git.drupal.org/project/override_node_options.git
```
At the time of writing, the Git repository URL follow this same format -
`https://git.drupal.org/project/{name}.git` (also the `.git` file extension is
optional).
To shorten and simplify this, I can add this snippet to my `~/.gitconfig` file:
```
[url "https://git.drupal.org/project/"]
insteadOf = do:
insteadOf = drupal:
```
With that added, I can now instead run `git clone drupal:{name}` or
`git clone do:{name}` to clone the repository, specifying the projects machine
name.
For example, to clone the Override Node Options module, I can now do this using
just `git clone drupal:override_node_options`.
This, I think, is definitely quicker and easier!
## Resources
You can view my entire `.gitconfig` file, as well as my other dotfiles, in
[my dotfiles repository on GitHub](https://github.com/opdavies/dotfiles/blob/master/.gitconfig).