How I clone very large repositories with git

We have problems lately to clone a repository from our git server. It seems that the one of our repositories is too big to clone from scratch. We are suffering with network timeouts. We use git as version control, so it is not a problem. There are alternatives.

  1. You can copy the closed source directory from a colleague.
  2. You can clone it from a bundle.

This post is about the second option. I am a fan of bundling a repository to share it. How does that work?

Person A has already cloned a repository of the project on his system. What should he do?

Git created a file called closed-source.bundle in the current directory. This file is a copy of the complete repository now. It is a single file. Person A can share this file via a network drive. Person B can then copy that file and just take a clone of it.

Person B has now a checked out version of the project with a remote that points to the bundle. Remove that remote and set to the correct location.

Now person B can work like he just cloned it directly from the remote git server.

Lijst met alle gemergde branches

remove_checkboxOnze repositories hebben vele branches, wat niet slecht is, goed zelfs, vind ik. Omdat elke branch het resultaat is van een nieuwe feature of bugfix zijn er nogal veel te vinden in onze repository. Als zulk een branch klaar is om gemerged te worden, dan moet iemand deze zaken reviewen. Dit reviewen gebeurd op gitlab. En als het allemaal klaar is, dan is 1 druk op de knop genoeg om alles automatisch te mergen naar onze master branch.

Na het mergen zou de oorspronkelijke branch gewist moeten worden, anders blijf je met vele branches zitten. Gitlab heeft hiervoor een check box. De default waarde is echter dat deze niet geselecteerd is, dus vergeten sommige team leden dit aan te vinken, met als gevolg dat deze branch niet weg is.

Om de branch te wissen kan je de volgende commando’s uitvoeren :

Als dit echter niet onmiddellijk na de merge gedaan wordt, dan is dat vergeten werk. Vandaar dat er vele branches overblijven, en na maanden werk is het niet echt zichtbaar meer welke branches nu gemerged zijn, en welke niet. Gelukkig heeft git hier ook een oplossing voor in de vorm van een commando:

Het bovenstaande commando toont welke remote branches er reeds gemerged zijn in de master branch. Het omgekeerde lukt ook, tonen welke branches er nog niet gemerged zijn in de master:

Wijzigen van de auteur

De eerste keer dat je git gebruikt, zou je jezelf moeten identificeren door je gebruikersnaam en je mail adres op te geven. Dit omdat deze gegevens in elke commit verwerkt wordt.

Dat kan gedaan worden op systeem niveau door:

Soms wil je een ander mail adres hebben voor een ander project, dus in een andere repository. Dat kan door in die repository de global optie weg te laten:

Ik gebruik dit vaak, omdat mijn open source werk met een ander mail adres gedaan wordt, dan mijn echte dagdagelijkse job.

Maar meestal vergeet ik de eerste keren wel eens om mijn mailadres goed te zetten, zeker als ik de repository nog eens clone. Gelukkig kan dit allemaal ook ongedaan gemaakt worden, afhankelijk van de situatie.

Stel dat enkel de mail van de laatste commit gewijzigd moet worden. Dat is de makkelijkste manier, dan moet je enkel het volgende typen:

Nu kan je de commit message saven en alles is in orde.

Stel nu dat er enkele commits gewijzigd moeten worden. Dan is er een iets complexere methode. Interactieve rebase is onze oplossing deze keer:

Na dit commando komt een editor naar boven en nu kan je de commits wijzigen die je wil wijzigen. Kies dan ook voor de edit optie van de commits die je wil wijzigen, dat is de optie e. Het process start daarna en stopt bij een commit message. Dan moet je het volgende ingeven:

Save het en ga verder met de rebase:

Nu is de auteur gewijzigd. Een beetje meer werk, maar alles is dus mogelijk.

Disable fast forwarding in git

In git is er een optie om fast forwarding niet meer te doen tijdens een merge:

In ons team is de afspraak om nooit fast forwarding te gebruiken, dus is het handig dat deze optie nooit meegegeven hoeft te worden. Dit kan door een configuratie parameter:

Nadat je dit commando hebt gegeven, zijn alle merges voortaan zonder fast forwarding.

How do I show the current revision

Our code is located in a git repository. If I want to know what is the current revision, I can use git log. Look then to the output on the screen and you can get a hash of the current revision. There are alternatives. Git log has many options that are not known by everybody.

How can I show the short hash of the current revision?

The command is however too large to remember. I am lucky, because I can use the alias command, so I can create an alias that I can remember. To have the alias globally known on my system, the option –global is handy.