84 lines
3.2 KiB
Markdown
84 lines
3.2 KiB
Markdown
---
|
||
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 I’d 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 Drupal’s
|
||
[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 project’s 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).
|