{ ... }:

{
  # Enable GIT.
  programs.git = {
    enable = true;
    lfs.enable = true;

    settings = {
      aliases = {
        # List aliases
        aliases = "config --get-regexp alias";

        # List all the contributors with commit amount
        contributors = "shortlog --summary --numbered";

        # Output verbose info about branches and tags
        branches = "branch -avv";

        # List all tags
        tags = "tag -l";

        # Pretty logs
        plog = "log --graph --decorate --all";

        # Pretty grep
        gcommit = "log --graph --decorate --grep";
      };

      core = {
        # Set the editor to be used by GIT
        editor = "nvim";

        # Custom .gitignore
        excludesfile = "~/.gitignore";

        # Treat trailing whitespaces and spaces before tabs as an error
        whitespace = "space-before-tab,-indent-with-non-tab,trailing-space";
      };

      color = {
        # Use colors in GIT commmands.
        ui = "auto";
      };

      commit = {
        # https://help.github.com/articles/signing-commits-using-gpg/
        gpgsign = true;
      };

      tag = {
        gpgsign = true;
      };

      difftool = {
        prompt = true;
      };

      mergetool = {
        # https://www.git-scm.com/docs/git-mergetool#Documentation/git-mergetool.txt---no-prompt
        prompt = false;
      };

      merge = {
        # https://git-scm.com/docs/git-merge#_how_conflicts_are_presented
        conflictstyle = "diff3";
      };

      push = {
        # https://stackoverflow.com/questions/21839651/git-what-is-the-difference-between-push-default-matching-and-simple
        default = "simple";

        # git-push pushes relevant annotated tags when pushing branches out
        followTags = true;
      };

      user = {
        name = "Alexandre Cavalheiro S. Tiago da Silva";
        email = "contact@thewizard.link";
        signingkey = "A1D3A2B4E14BD7C0445BB749A5767B54367CFBDF";
      };

      pull = {
        ff = "only";
      };

      init = {
        defaultBranch = "main";
      };
    };
  };
}
