git-barepo

Tools for sharing git bare repositories
git clone git://git.meso-star.fr/git-repo.git
Log | Files | Refs | README | LICENSE

commit 7b0ff250da1b5f3d67992c0c8582a0db75462178
parent d501d3bcba119465f9d80fabed82ce5b87eea18d
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Mon, 19 Jan 2026 21:26:03 +0100

Rename the git-repo command to git-barepo

git-repo is actually a new git command that conflicts with this tool.
The git-repo script is therefore renamed to git-barepo, which combines
the terms BARE and REPOsitory.

Diffstat:
MMakefile | 34+++++++++++++++++-----------------
Agit-barepo | 231+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Agit-barepo.1 | 113+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dgit-repo | 231-------------------------------------------------------------------------------
Dgit-repo.1 | 113-------------------------------------------------------------------------------
5 files changed, 361 insertions(+), 361 deletions(-)

diff --git a/Makefile b/Makefile @@ -31,32 +31,32 @@ install: cp "$$@" "$${prefix}"; \ chmod "$${mode}" "$$@"; \ }; \ - install 755 "$(DESTDIR)$(BINPREFIX)" git-repo; \ - install 644 "$(DESTDIR)$(MANPREFIX)/man1" git-repo.1; \ + install 755 "$(DESTDIR)$(BINPREFIX)" git-barepo; \ + install 644 "$(DESTDIR)$(MANPREFIX)/man1" git-barepo.1; \ install 644 "$(DESTDIR)$(MANPREFIX)/man1" git-publish.1; \ - install 644 "$(DESTDIR)$(APPPREFIX)/git-repo" logo.png; \ - install 644 "$(DESTDIR)$(APPPREFIX)/git-repo" post-receive.in; \ - install 644 "$(DESTDIR)$(APPPREFIX)/git-repo" style.css; \ - install 644 "$(DESTDIR)$(PREFIX)/share/doc/git-repo" COPYING; \ - install 644 "$(DESTDIR)$(PREFIX)/share/doc/git-repo" README.md - sed 's#@RESOURCES_PATH@#$(DESTDIR)$(APPPREFIX)/git-repo#g' \ + install 644 "$(DESTDIR)$(APPPREFIX)/git-barepo" logo.png; \ + install 644 "$(DESTDIR)$(APPPREFIX)/git-barepo" post-receive.in; \ + install 644 "$(DESTDIR)$(APPPREFIX)/git-barepo" style.css; \ + install 644 "$(DESTDIR)$(PREFIX)/share/doc/git-barepo" COPYING; \ + install 644 "$(DESTDIR)$(PREFIX)/share/doc/git-barepo" README.md + sed 's#@RESOURCES_PATH@#$(DESTDIR)$(APPPREFIX)/git-barepo#g' \ git-publish > "$(DESTDIR)$(BINPREFIX)/git-publish" chmod 755 "$(DESTDIR)$(BINPREFIX)/git-publish" uninstall: rm -f "$(DESTDIR)$(BINPREFIX)/git-publish" - rm -f "$(DESTDIR)$(BINPREFIX)/git-repo" - rm -f "$(DESTDIR)$(MANPREFIX)/man1/git-repo.1" + rm -f "$(DESTDIR)$(BINPREFIX)/git-barepo" + rm -f "$(DESTDIR)$(MANPREFIX)/man1/git-barepo.1" rm -f "$(DESTDIR)$(MANPREFIX)/man1/git-publish.1" - rm -f "$(DESTDIR)$(APPPREFIX)/git-repo/logo.png" - rm -f "$(DESTDIR)$(APPPREFIX)/git-repo/post-receive.in" - rm -f "$(DESTDIR)$(APPPREFIX)/git-repo/style.css" - rm -f "$(DESTDIR)$(PREFIX)/share/doc/git-repo/README.md" - rm -f "$(DESTDIR)$(PREFIX)/share/doc/git-repo/COPYING" + rm -f "$(DESTDIR)$(APPPREFIX)/git-barepo/logo.png" + rm -f "$(DESTDIR)$(APPPREFIX)/git-barepo/post-receive.in" + rm -f "$(DESTDIR)$(APPPREFIX)/git-barepo/style.css" + rm -f "$(DESTDIR)$(PREFIX)/share/doc/git-barepo/README.md" + rm -f "$(DESTDIR)$(PREFIX)/share/doc/git-barepo/COPYING" lint: shellcheck -o all git-publish - shellcheck -o all git-repo + shellcheck -o all git-barepo shellcheck -o all post-receive.in mandoc -Wbase -Tlint git-publish.1 || [ $$? -le 1 ]; - mandoc -Wbase -Tlint git-repo.1 + mandoc -Wbase -Tlint git-barepo.1 diff --git a/git-barepo b/git-barepo @@ -0,0 +1,231 @@ +#!/bin/sh + +# Copyright (C) 2024-2026 |Méso|Star> (contact@meso-star.com) +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +set -e + +git_barepo_tmpdir="$(mktemp -d "${TMPDIR:-/tmp}/git_barepo_XXXXXX")" + +die() +{ + rm -rf "${git_barepo_tmpdir}" # cleanup temporary files + exit "${1:-1}" # return status code (default is 1) +} + +# Configure signal processing +trap 'die $?' EXIT + +######################################################################## +# Helper functions +######################################################################## +synopsis() +{ + cmd="${0##*/}" + >&2 printf 'usage: %s [-Ddp] [-s group] directory\n' "${cmd}" +} + +# Print group permissions to be sent to chmod to make a file private +grp_priv_perm() # file +( + # shellcheck disable=SC2012 + grp="$(ls -dl "$1" | cut -d' ' -f1 | cut -c5-7)" + + # Disable the write and set-group-ID-on-execution permissions if there + # are not default file permissions + if ! printf '%s\n' "${grp}" | grep -e 'w'; then + perm="${perm}w" + fi + + if ! printf '%s\n' "${perm}" | grep -e '[sS]'; then + perm="${perm}s" + fi + + printf 'g-%s\n' "${perm}" +) + +# Print group permissions to be sent to chmod to make a regular file +# private +file_grp_priv_perm() +( + f="${git_barepo_tmpdir}/file" + touch "${f}" + grp_priv_perm "${f}" +) + +# Print group permissions to be sent to chmod to make a directory +# private +dir_grp_priv_perm() +( + d="${git_barepo_tmpdir}/dir" + mkdir -p "${d}" + grp_priv_perm "${d}" +) + +# Share the repository +share() # repo, group +( + u="$(id -un)" + + # Search for files in the repository that do NOT belong to the user. + # If there are any, the repository permissions cannot be updated. + f="$(find "$1" ! -user "${u}")" + if [ -n "${f}" ]; then + >&2 printf 'Could not share the repository: '\ +'some files do not belong to %s\n' "${u}" + die + fi + + chown -R :"$2" "$1" + find "$1" -type f -exec chmod "g+w" {} \; + find "$1" -type d -exec chmod "g+ws" {} \; + cd -- "$1" + git config --local core.sharedRepository group + cd -- "${OLDPWD}" +) + +# Do not share the repository and define the group as the user's group +privatise() # repo +( + u="$(id -un)" + g="$(id -gn)" + + # Search for files in the repository that do NOT belong to the user. + # If there are any, the repository permissions cannot be updated. + f="$(find "$1" ! -user "${u}")" + if [ -n "${f}" ]; then + >&2 printf 'Could not privatise the repository: '\ +'some files do not belong to %s\n' "${u}" + die + fi + + fgperm="$(file_grp_priv_perm)" + dgperm="$(dir_grp_priv_perm)" + + chown -R :"${g}" "$1" + find "$1" -type f -exec chmod "${fgperm}" {} \; + find "$1" -type d -exec chmod "${dgperm}" {} \; + cd -- "$1" + git config --local core.sharedRepository false + cd -- "${OLDPWD}" +) + +dumb() # git_dir +( + if [ -f "$1"/hooks/post-update.sample ]; then + mv "$1"/hooks/post-update.sample "$1"/hooks/post-update + cd -- "$1"/hooks/ + ./post-update || die "$?" + cd -- "${OLDPWD}" + fi +) + +nodumb() # git_dir +( + if [ -f "$1"/hooks/post-update ]; then + mv "$1"/hooks/post-update "$1"/hooks/post-update.sample + fi +) + +######################################################################## +# The script +######################################################################## +nodumb=0 +dumb=0 +privatise=0 +group="" + +# Parse input arguments +OPTIND=1 +while getopts ":dDps:" opt; do + case "${opt}" in + D) nodumb=1 ;; + d) dumb=1 ;; + p) privatise=1 ;; + s) group="${OPTARG}" ;; + *) synopsis; die ;; + esac +done + +[ "${OPTIND}" -gt "$#" ] && { synopsis; die; } + +# Skip parsed arguments +shift $((OPTIND - 1)) + +repo="$1" + +# The input repository does not exist +if [ ! -e "${repo}" ]; then + + # Remove trailing slashes + repo="$(echo "${repo}" | sed 's#/\+$##g')" + + # Ensure that the repository name includes the .git extension, in + # accordance with the convention applicable to bare repositories. + suffix="${repo##*.}" + if [ "${suffix}" != "git" ] \ + || [ "${suffix}" = "${repo}" ]; then + repo="${repo}.git" + fi + + mkdir -p "${repo}" + git init --bare "${repo}" + + git_dir="${repo}" + +# Verify that the existing path is indeed a bare git repository +else + # Check that it is a directory + if [ ! -d "${repo}" ]; then + >&2 printf '%s: not a git repository\n' "${repo}" + die + fi + + cd -- "${repo}" + + # Retrieve the absolute path to the "git" directory, i.e., the + # directory where git data is stored + if ! git_dir=$(git rev-parse --git-dir 2>&1) + then + >&2 printf '%s: %s\n' "${repo}" "${git_dir}" + die + fi + git_dir="$(cd "${git_dir}" && pwd)" + + # Check that the repository is a bare repository + if ! git_bare=$(git rev-parse --is-bare-repository) \ + || [ "${git_bare}" = "false" ]; then + >&2 printf '%s: not a git bare repository\n' "${repo}" + die + fi + + cd -- "${OLDPWD}" +fi + +if [ -n "${group}" ]; then + share "${repo}" "${group}" +fi + +if [ "${privatise}" -ne 0 ]; then + privatise "${repo}" +fi + +if [ "${dumb}" -ne 0 ]; then + dumb "${git_dir}" +fi + +if [ "${nodumb}" -ne 0 ]; then + nodumb "${git_dir}" +fi diff --git a/git-barepo.1 b/git-barepo.1 @@ -0,0 +1,113 @@ +.\" Copyright (C) 2024-2026 |Méso|Star> (contact@meso-star.com) +.\" +.\" This program is free software: you can redistribute it and/or modify +.\" it under the terms of the GNU General Public License as published by +.\" the Free Software Foundation, either version 3 of the License, or +.\" (at your option) any later version. +.\" +.\" This program is distributed in the hope that it will be useful, +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +.\" GNU General Public License for more details. +.\" +.\" You should have received a copy of the GNU General Public License +.\" along with this program. If not, see <http://www.gnu.org/licenses/>. +.Dd January 19, 2025 +.Dt GIT-BAREPO 1 +.Os +.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +.Sh NAME +.Nm git-barepo +.Nd setting up a bare repository +.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +.Sh SYNOPSIS +.Nm +.Op Fl Ddp +.Op Fl s Ar group +.Ar directory +.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +.Sh DESCRIPTION +.Nm +helps to set up a git bare repository. +If the input +.Ar directory +does not exist, it is created and initialized as a bare git repository +before being configured according to the defined options. +Otherwise, +.Nm +verifies that the given +.Ar directory +is indeed a bare git repository before updating its configuration. +.Pp +The options are as follows: +.Bl -tag -width Ds +.It Fl D +Disable read access via the HTTP[S] protocol, i.e., disable dumb +transport. +This is the default configuration for the repository. +.It Fl d +Prepare the repository for read-only access via the HTTP[S] protocol, +i.e., for use over dumb transports. +.It Fl p +Make the repository private, i.e., define the group as the effective +group as returned by +.Ql id -gn +and restore the group's default permissions, most likely read-only +access. +.It Fl s Ar group +Share write access to the given +.Ar group +so that each member of the group can update the repository. +.Pp +Once shared, internal files belong to the users who created them, so the +repository is effectively owned by the co-authors. +Consequently, all users, including the one who created and shared the +repository, have write access via their group ID rather than their user +ID. +It is therefore impossible to privatize a shared repository +.Po +option +.Fl p +.Pc +or update its group if a co-author has already pushed updates. +.El +.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +.Sh EXIT +.Ex -std +.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +.Sh EXAMPLES +Set up a regular bare repository: +.Bd -literal -offset Ds +git barepo /path/to/the/git/repository.git +.Ed +.Pp +Set up a bare repository with write access shared with the +.Ar users +group: +.Bd -literal -offset Ds +git barepo -s users /path/to/the/git/repository.git +.Ed +.Pp +Same as above, but enables dumb transports to allow read-only access via +HTTP[S]: +.Bd -literal -offset Ds +git barepo -ds users /path/to/the/git/repository.git +.Ed +.Pp +Create a regular bare repository. +Update it to enable dumb transports. +Then give write access to the +.Ar users +group. +Finally, cancel support for dumb transports but retain shared write +access with +.Ar users . +.Bd -literal -offset Ds +git barepo /path/to/the/git/repository.git +git barepo -d /path/to/the/git/repository.git +git barepo -s users /path/to/the/git/repository.git +git barepo -D /path/to/the/git/repository.git +.Ed +.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +.Sh SEE ALSO +.Xr git 1 diff --git a/git-repo b/git-repo @@ -1,231 +0,0 @@ -#!/bin/sh - -# Copyright (C) 2024-2026 |Méso|Star> (contact@meso-star.com) -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -set -e - -git_repo_tmpdir="$(mktemp -d "${TMPDIR:-/tmp}/git_repo_XXXXXX")" - -die() -{ - rm -rf "${git_repo_tmpdir}" # cleanup temporary files - exit "${1:-1}" # return status code (default is 1) -} - -# Configure signal processing -trap 'die $?' EXIT - -######################################################################## -# Helper functions -######################################################################## -synopsis() -{ - cmd="${0##*/}" - >&2 printf 'usage: %s [-Ddp] [-s group] directory\n' "${cmd}" -} - -# Print group permissions to be sent to chmod to make a file private -grp_priv_perm() # file -( - # shellcheck disable=SC2012 - grp="$(ls -dl "$1" | cut -d' ' -f1 | cut -c5-7)" - - # Disable the write and set-group-ID-on-execution permissions if there - # are not default file permissions - if ! printf '%s\n' "${grp}" | grep -e 'w'; then - perm="${perm}w" - fi - - if ! printf '%s\n' "${perm}" | grep -e '[sS]'; then - perm="${perm}s" - fi - - printf 'g-%s\n' "${perm}" -) - -# Print group permissions to be sent to chmod to make a regular file -# private -file_grp_priv_perm() -( - f="${git_repo_tmpdir}/file" - touch "${f}" - grp_priv_perm "${f}" -) - -# Print group permissions to be sent to chmod to make a directory -# private -dir_grp_priv_perm() -( - d="${git_repo_tmpdir}/dir" - mkdir -p "${d}" - grp_priv_perm "${d}" -) - -# Share the repository -share() # repo, group -( - u="$(id -un)" - - # Search for files in the repository that do NOT belong to the user. - # If there are any, the repository permissions cannot be updated. - f="$(find "$1" ! -user "${u}")" - if [ -n "${f}" ]; then - >&2 printf 'Could not share the repository: '\ -'some files do not belong to %s\n' "${u}" - die - fi - - chown -R :"$2" "$1" - find "$1" -type f -exec chmod "g+w" {} \; - find "$1" -type d -exec chmod "g+ws" {} \; - cd -- "$1" - git config --local core.sharedRepository group - cd -- "${OLDPWD}" -) - -# Do not share the repository and define the group as the user's group -privatise() # repo -( - u="$(id -un)" - g="$(id -gn)" - - # Search for files in the repository that do NOT belong to the user. - # If there are any, the repository permissions cannot be updated. - f="$(find "$1" ! -user "${u}")" - if [ -n "${f}" ]; then - >&2 printf 'Could not privatise the repository: '\ -'some files do not belong to %s\n' "${u}" - die - fi - - fgperm="$(file_grp_priv_perm)" - dgperm="$(dir_grp_priv_perm)" - - chown -R :"${g}" "$1" - find "$1" -type f -exec chmod "${fgperm}" {} \; - find "$1" -type d -exec chmod "${dgperm}" {} \; - cd -- "$1" - git config --local core.sharedRepository false - cd -- "${OLDPWD}" -) - -dumb() # git_dir -( - if [ -f "$1"/hooks/post-update.sample ]; then - mv "$1"/hooks/post-update.sample "$1"/hooks/post-update - cd -- "$1"/hooks/ - ./post-update || die "$?" - cd -- "${OLDPWD}" - fi -) - -nodumb() # git_dir -( - if [ -f "$1"/hooks/post-update ]; then - mv "$1"/hooks/post-update "$1"/hooks/post-update.sample - fi -) - -######################################################################## -# The script -######################################################################## -nodumb=0 -dumb=0 -privatise=0 -group="" - -# Parse input arguments -OPTIND=1 -while getopts ":dDps:" opt; do - case "${opt}" in - D) nodumb=1 ;; - d) dumb=1 ;; - p) privatise=1 ;; - s) group="${OPTARG}" ;; - *) synopsis; die ;; - esac -done - -[ "${OPTIND}" -gt "$#" ] && { synopsis; die; } - -# Skip parsed arguments -shift $((OPTIND - 1)) - -repo="$1" - -# The input repository does not exist -if [ ! -e "${repo}" ]; then - - # Remove trailing slashes - repo="$(echo "${repo}" | sed 's#/\+$##g')" - - # Ensure that the repository name includes the .git extension, in - # accordance with the convention applicable to bare repositories. - suffix="${repo##*.}" - if [ "${suffix}" != "git" ] \ - || [ "${suffix}" = "${repo}" ]; then - repo="${repo}.git" - fi - - mkdir -p "${repo}" - git init --bare "${repo}" - - git_dir="${repo}" - -# Verify that the existing path is indeed a bare git repository -else - # Check that it is a directory - if [ ! -d "${repo}" ]; then - >&2 printf '%s: not a git repository\n' "${repo}" - die - fi - - cd -- "${repo}" - - # Retrieve the absolute path to the "git" directory, i.e., the - # directory where git data is stored - if ! git_dir=$(git rev-parse --git-dir 2>&1) - then - >&2 printf '%s: %s\n' "${repo}" "${git_dir}" - die - fi - git_dir="$(cd "${git_dir}" && pwd)" - - # Check that the repository is a bare repository - if ! git_bare=$(git rev-parse --is-bare-repository) \ - || [ "${git_bare}" = "false" ]; then - >&2 printf '%s: not a git bare repository\n' "${repo}" - die - fi - - cd -- "${OLDPWD}" -fi - -if [ -n "${group}" ]; then - share "${repo}" "${group}" -fi - -if [ "${privatise}" -ne 0 ]; then - privatise "${repo}" -fi - -if [ "${dumb}" -ne 0 ]; then - dumb "${git_dir}" -fi - -if [ "${nodumb}" -ne 0 ]; then - nodumb "${git_dir}" -fi diff --git a/git-repo.1 b/git-repo.1 @@ -1,113 +0,0 @@ -.\" Copyright (C) 2024-2026 |Méso|Star> (contact@meso-star.com) -.\" -.\" This program is free software: you can redistribute it and/or modify -.\" it under the terms of the GNU General Public License as published by -.\" the Free Software Foundation, either version 3 of the License, or -.\" (at your option) any later version. -.\" -.\" This program is distributed in the hope that it will be useful, -.\" but WITHOUT ANY WARRANTY; without even the implied warranty of -.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -.\" GNU General Public License for more details. -.\" -.\" You should have received a copy of the GNU General Public License -.\" along with this program. If not, see <http://www.gnu.org/licenses/>. -.Dd December 3, 2025 -.Dt GIT-REPO 1 -.Os -.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -.Sh NAME -.Nm git-repo -.Nd setting up a bare repository -.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -.Sh SYNOPSIS -.Nm -.Op Fl Ddp -.Op Fl s Ar group -.Ar directory -.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -.Sh DESCRIPTION -.Nm -helps to set up a git bare repository. -If the input -.Ar directory -does not exist, it is created and initialized as a bare git repository -before being configured according to the defined options. -Otherwise, -.Nm -verifies that the given -.Ar directory -is indeed a bare git repository before updating its configuration. -.Pp -The options are as follows: -.Bl -tag -width Ds -.It Fl D -Disable read access via the HTTP[S] protocol, i.e., disable dumb -transport. -This is the default configuration for the repository. -.It Fl d -Prepare the repository for read-only access via the HTTP[S] protocol, -i.e., for use over dumb transports. -.It Fl p -Make the repository private, i.e., define the group as the effective -group as returned by -.Ql id -gn -and restore the group's default permissions, most likely read-only -access. -.It Fl s Ar group -Share write access to the given -.Ar group -so that each member of the group can update the repository. -.Pp -Once shared, internal files belong to the users who created them, so the -repository is effectively owned by the co-authors. -Consequently, all users, including the one who created and shared the -repository, have write access via their group ID rather than their user -ID. -It is therefore impossible to privatize a shared repository -.Po -option -.Fl p -.Pc -or update its group if a co-author has already pushed updates. -.El -.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -.Sh EXIT -.Ex -std -.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -.Sh EXAMPLES -Set up a regular bare repository: -.Bd -literal -offset Ds -git repo /path/to/the/git/repository.git -.Ed -.Pp -Set up a bare repository with write access shared with the -.Ar users -group: -.Bd -literal -offset Ds -git repo -s users /path/to/the/git/repository.git -.Ed -.Pp -Same as above, but enables dumb transports to allow read-only access via -HTTP[S]: -.Bd -literal -offset Ds -git repo -ds users /path/to/the/git/repository.git -.Ed -.Pp -Create a regular bare repository. -Update it to enable dumb transports. -Then give write access to the -.Ar users -group. -Finally, cancel support for dumb transports but retain shared write -access with -.Ar users . -.Bd -literal -offset Ds -git repo /path/to/the/git/repository.git -git repo -d /path/to/the/git/repository.git -git repo -s users /path/to/the/git/repository.git -git repo -D /path/to/the/git/repository.git -.Ed -.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -.Sh SEE ALSO -.Xr git 1