From 87e80c4b5fec421ecd566498b7dd4672f76fdca2 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Sun, 22 Jan 2006 17:24:22 -0800 Subject: [PATCH 1/6] git-clone: PG13 --naked option to --bare. Signed-off-by: Junio C Hamano --- Documentation/git-clone.txt | 12 ++++++------ Documentation/repository-layout.txt | 6 +++--- git-clone.sh | 15 ++++++++------- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt index 8488202e3c..370f53e769 100644 --- a/Documentation/git-clone.txt +++ b/Documentation/git-clone.txt @@ -9,7 +9,7 @@ git-clone - Clones a repository. SYNOPSIS -------- [verse] -'git-clone' [-l [-s]] [-q] [-n] [--naked] [-o ] [-u ] +'git-clone' [-l [-s]] [-q] [-n] [--bare] [-o ] [-u ] [] DESCRIPTION @@ -58,8 +58,8 @@ OPTIONS -n:: No checkout of HEAD is performed after the clone is complete. ---naked:: - Make a 'naked' GIT repository. That is, instead of +--bare:: + Make a 'bare' GIT repository. That is, instead of creating `` and placing the administrative files in `/.git`, make the `` itself the `$GIT_DIR`. This implies `-n` option. @@ -110,17 +110,17 @@ $ git show-branch ------------ -Create a naked repository to publish your changes to the public:: +Create a bare repository to publish your changes to the public:: + ------------ -$ git clone --naked -l /home/proj/.git /pub/scm/proj.git +$ git clone --bare -l /home/proj/.git /pub/scm/proj.git ------------ Create a repository on the kernel.org machine that borrows from Linus:: + ------------ -$ git clone --naked -l -s /pub/scm/.../torvalds/linux-2.6.git \ +$ git clone --bare -l -s /pub/scm/.../torvalds/linux-2.6.git \ /pub/scm/.../me/subsys-2.6.git ------------ diff --git a/Documentation/repository-layout.txt b/Documentation/repository-layout.txt index 0347cabbb3..1f19bf86dd 100644 --- a/Documentation/repository-layout.txt +++ b/Documentation/repository-layout.txt @@ -3,7 +3,7 @@ git repository layout You may find these things in your git repository (`.git` directory for a repository associated with your working tree, or -`'project'.git` directory for a public 'naked' repository). +`'project'.git` directory for a public 'bare' repository). objects:: Object store associated with this repository. Usually @@ -73,7 +73,7 @@ HEAD:: A symlink of the form `refs/heads/'name'` to point at the current branch, if exists. It does not mean much if the repository is not associated with any working tree - (i.e. 'naked' repository), but a valid git repository + (i.e. a 'bare' repository), but a valid git repository *must* have such a symlink here. It is legal if the named branch 'name' does not (yet) exist. @@ -92,7 +92,7 @@ hooks:: index:: The current index file for the repository. It is - usually not found in a naked repository. + usually not found in a bare repository. info:: Additional information about the repository is recorded diff --git a/git-clone.sh b/git-clone.sh index ded40856c5..8e65202320 100755 --- a/git-clone.sh +++ b/git-clone.sh @@ -9,7 +9,7 @@ unset CDPATH usage() { - echo >&2 "Usage: $0 [--naked] [-l [-s]] [-q] [-u ] [-o ] [-n] []" + echo >&2 "Usage: $0 [--bare] [-l [-s]] [-q] [-u ] [-o ] [-n] []" exit 1 } @@ -53,7 +53,7 @@ use_local=no local_shared=no no_checkout= upload_pack= -naked= +bare= origin=origin while case "$#,$1" in @@ -61,7 +61,8 @@ while *,-n|*,--no|*,--no-|*,--no-c|*,--no-ch|*,--no-che|*,--no-chec|\ *,--no-check|*,--no-checko|*,--no-checkou|*,--no-checkout) no_checkout=yes ;; - *,--na|*,--nak|*,--nake|*,--naked) naked=yes ;; + *,--na|*,--nak|*,--nake|*,--naked|\ + *,-b|*,--b|*,--ba|*,--bar|*,--bare) bare=yes ;; *,-l|*,--l|*,--lo|*,--loc|*,--loca|*,--local) use_local=yes ;; *,-s|*,--s|*,--sh|*,--sha|*,--shar|*,--share|*,--shared) local_shared=yes; use_local=yes ;; @@ -85,8 +86,8 @@ do shift done -# --naked implies --no-checkout -test -z "$naked" || no_checkout=yes +# --bare implies --no-checkout +test =z "$bare" || no_checkout=yes # Turn the source into an absolute path if # it is local @@ -103,11 +104,11 @@ dir="$2" [ -e "$dir" ] && echo "$dir already exists." && usage mkdir -p "$dir" && D=$(cd "$dir" && pwd) && -case "$naked" in +case "$bare" in yes) GIT_DIR="$D" ;; *) GIT_DIR="$D/.git" ;; esac && export GIT_DIR && git-init-db || usage -case "$naked" in +case "$bare" in yes) GIT_DIR="$D" ;; *) From 4fb66a62eeb7bfec115cd0058d7a05ab62fc23e7 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Sun, 22 Jan 2006 17:27:52 -0800 Subject: [PATCH 2/6] clone: do not create remotes/origin nor origin branch in a bare repository. It is simply pointless, since no merges will ever happen in such a repository. Signed-off-by: Junio C Hamano --- Documentation/git-clone.txt | 4 +++- git-clone.sh | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt index 370f53e769..684e4bdf69 100644 --- a/Documentation/git-clone.txt +++ b/Documentation/git-clone.txt @@ -62,7 +62,9 @@ OPTIONS Make a 'bare' GIT repository. That is, instead of creating `` and placing the administrative files in `/.git`, make the `` - itself the `$GIT_DIR`. This implies `-n` option. + itself the `$GIT_DIR`. This implies `-n` option. When + this option is used, neither the `origin` branch nor the + default `remotes/origin` file is created. -o :: Instead of using the branch name 'origin' to keep track diff --git a/git-clone.sh b/git-clone.sh index 8e65202320..73fc919800 100755 --- a/git-clone.sh +++ b/git-clone.sh @@ -209,7 +209,7 @@ esac cd "$D" || exit -if test -f "$GIT_DIR/HEAD" +if test -f "$GIT_DIR/HEAD" && test -z "$bare" then head_points_at=`git-symbolic-ref HEAD` case "$head_points_at" in From e6489a1bdf6e20371e6cd6497918f1c1198d5f81 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Sun, 22 Jan 2006 17:28:49 -0800 Subject: [PATCH 3/6] clone: do not accept more than one -o option. Signed-off-by: Junio C Hamano --- git-clone.sh | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/git-clone.sh b/git-clone.sh index 73fc919800..47f3ec9761 100755 --- a/git-clone.sh +++ b/git-clone.sh @@ -55,6 +55,7 @@ no_checkout= upload_pack= bare= origin=origin +origin_override= while case "$#,$1" in 0,*) break ;; @@ -73,6 +74,11 @@ while echo >&2 "'$2' is not suitable for a branch name" exit 1 } + test -z "$origin_override" || { + echo >&2 "Do not give more than one -o options." + exit 1 + } + origin_override=yes origin="$2"; shift ;; 1,-u|1,--upload-pack) usage ;; @@ -87,7 +93,15 @@ do done # --bare implies --no-checkout -test =z "$bare" || no_checkout=yes +if test yes = "$bare" +then + if test yes = "$origin_override" + then + echo >&2 '--bare and -o $origin options are incompatible.' + exit 1 + fi + no_checkout=yes +fi # Turn the source into an absolute path if # it is local From 2c620a1ad1dce1e249d66ce18c7b1cce22d5d64c Mon Sep 17 00:00:00 2001 From: Michal Ostrowski Date: Fri, 20 Jan 2006 13:05:24 -0500 Subject: [PATCH 4/6] git-fetch: pass --upload-pack to fetch-pack Without this, there is no way to specify a remote executable when invoking git-pull/git-fetch as there is for git-clone. [jc: I have a mild suspicion that this is a broken environment (aka sysadmin disservice). It may be legal to configure your sshd to spawn named program without involving shell at all, and if your sysadmin does so and you have your git programs under your home directory, you would need something like this, but then I suspect you would need such workaround everywhere, not just git. But we have these options we can use to work around the issue, so there is no strong reason not to reject this patch, either. ] Signed-off-by: Michal Ostrowski Signed-off-by: Junio C Hamano --- Documentation/fetch-options.txt | 7 +++++++ git-fetch.sh | 8 +++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/Documentation/fetch-options.txt b/Documentation/fetch-options.txt index e624d3d0ee..83237562d2 100644 --- a/Documentation/fetch-options.txt +++ b/Documentation/fetch-options.txt @@ -3,6 +3,13 @@ existing contents of `.git/FETCH_HEAD`. Without this option old data in `.git/FETCH_HEAD` will be overwritten. +--upload-pack :: +-u :: + When given, and the repository to fetch from is handled + by 'git-fetch-pack', '--exec=' is passed to + the command to specify non-default path for the command + run on the other end. + -f, \--force:: When `git-fetch` is used with `:` refspec, it refuses to update the local branch diff --git a/git-fetch.sh b/git-fetch.sh index 4a0cb32f30..d1659e2cfe 100755 --- a/git-fetch.sh +++ b/git-fetch.sh @@ -17,12 +17,18 @@ append= force= verbose= update_head_ok= +exec= while case "$#" in 0) break ;; esac do case "$1" in -a|--a|--ap|--app|--appe|--appen|--append) append=t ;; + -u|--u|--up|--upl|--uploa|--upload|--upload-|--upload-p|--upload-pa|\ + --upload-pac|--upload-pack) + shift + exec="--exec=$1" + ;; -f|--f|--fo|--for|--forc|--force) force=t ;; @@ -312,7 +318,7 @@ fetch_main () { ( : subshell because we muck with IFS IFS=" $LF" ( - git-fetch-pack $keep "$remote" $rref || echo failed "$remote" + git-fetch-pack $exec $keep "$remote" $rref || echo failed "$remote" ) | while read sha1 remote_name do From 96b086d6181067e9c76f543aaddfc7fcfd02649c Mon Sep 17 00:00:00 2001 From: Michal Ostrowski Date: Fri, 20 Jan 2006 13:38:16 -0500 Subject: [PATCH 5/6] git-{fetch,peek-remote} handling of --upload-pack git-peek-remote needs to handle a -u|--upload-pack parameter just like git-fetch (and git-fetch has to pass it on to git-peek-remote). (This is actually a follow-up to my previous git-fetch patch.) Signed-off-by: Michal Ostrowski Signed-off-by: Junio C Hamano --- git-fetch.sh | 6 ++++-- git-ls-remote.sh | 11 +++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/git-fetch.sh b/git-fetch.sh index d1659e2cfe..6730346ba0 100755 --- a/git-fetch.sh +++ b/git-fetch.sh @@ -18,6 +18,7 @@ force= verbose= update_head_ok= exec= +upload_pack= while case "$#" in 0) break ;; esac do case "$1" in @@ -28,6 +29,7 @@ do --upload-pac|--upload-pack) shift exec="--exec=$1" + upload_pack="-u $1" ;; -f|--f|--fo|--for|--forc|--force) force=t @@ -202,7 +204,7 @@ reflist=$(get_remote_refs_for_fetch "$@") if test "$tags" then taglist=$(IFS=" " && - git-ls-remote --tags "$remote" | + git-ls-remote $upload_pack --tags "$remote" | while read sha1 name do case "$name" in @@ -367,7 +369,7 @@ fetch_main "$reflist" case "$no_tags$tags" in '') taglist=$(IFS=" " && - git-ls-remote --tags "$remote" | + git-ls-remote $upload_pack --tags "$remote" | sed -ne 's|^\([0-9a-f]*\)[ ]\(refs/tags/.*\)^{}$|\1 \2|p' | while read sha1 name do diff --git a/git-ls-remote.sh b/git-ls-remote.sh index f69926862f..2c9a588d21 100755 --- a/git-ls-remote.sh +++ b/git-ls-remote.sh @@ -2,7 +2,8 @@ # usage () { - echo >&2 "usage: $0 [--heads] [--tags] ..." + echo >&2 "usage: $0 [--heads] [--tags] [-u|--upload-pack ]" + echo >&2 " ..." exit 1; } @@ -11,6 +12,7 @@ die () { exit 1 } +exec= while case "$#" in 0) break;; esac do case "$1" in @@ -18,6 +20,11 @@ do heads=heads; shift ;; -t|--t|--ta|--tag|--tags) tags=tags; shift ;; + -u|--u|--up|--upl|--uploa|--upload|--upload-|--upload-p|--upload-pa|\ + --upload-pac|--upload-pack) + shift + exec="--exec=$1" + shift;; --) shift; break ;; -*) @@ -66,7 +73,7 @@ rsync://* ) ;; * ) - git-peek-remote "$peek_repo" || + git-peek-remote $exec "$peek_repo" || echo "failed slurping" ;; esac | From 016fb48bc480dde83b57466f59f633cbc5128ae6 Mon Sep 17 00:00:00 2001 From: Matt Draisey Date: Thu, 19 Jan 2006 15:58:03 -0500 Subject: [PATCH 6/6] local push/pull env cleanup remove environment variables relating to the current repository before execing the 'remote' half of a local push or pull operation [jc: the original from Matt spelled out the environment variable names, which I changed to the preprocessor symbols defined in cache.h. Also it missed GRAFT_ENVIRONMENT.] Signed-off-by: Junio C Hamano --- connect.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/connect.c b/connect.c index d6f4e4c3a7..e1c04e1eae 100644 --- a/connect.c +++ b/connect.c @@ -644,10 +644,16 @@ int git_connect(int fd[2], char *url, const char *prog) ssh_basename++; execlp(ssh, ssh_basename, host, command, NULL); } - else + else { + unsetenv(ALTERNATE_DB_ENVIRONMENT); + unsetenv(DB_ENVIRONMENT); + unsetenv(GIT_DIR_ENVIRONMENT); + unsetenv(GRAFT_ENVIRONMENT); + unsetenv(INDEX_ENVIRONMENT); execlp("sh", "sh", "-c", command, NULL); + } die("exec failed"); - } + } fd[0] = pipefd[0][0]; fd[1] = pipefd[1][1]; close(pipefd[0][1]);