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:
| M | Makefile | | | 34 | +++++++++++++++++----------------- |
| A | git-barepo | | | 231 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | git-barepo.1 | | | 113 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| D | git-repo | | | 231 | ------------------------------------------------------------------------------- |
| D | git-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