[PATCH] git-ls-remote: show and optionally store remote refs.

Retrieve and list the remote refs from git, http, and rsync
repositories, and optionally stores the retrieved refs in the
local repository under the same name.

To access a git URL, git-peek-remote command is used.  An http
URL needs to have an up-to-date info/refs file for discovery,
which will be introduced by a later update-server-info patch.

Signed-off-by: Junio C Hamano <junkio@cox.net>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
maint
Junio C Hamano 2005-07-23 17:54:26 -07:00 committed by Linus Torvalds
parent 508e67ab6e
commit 0fec082272
2 changed files with 106 additions and 1 deletions

View File

@ -36,7 +36,8 @@ SCRIPTS=git git-apply-patch-script git-merge-one-file-script git-prune-script \
git-reset-script git-add-script git-checkout-script git-clone-script \
gitk git-cherry git-rebase-script git-relink-script git-repack-script \
git-format-patch-script git-sh-setup-script git-push-script \
git-branch-script git-parse-remote git-verify-tag-script
git-branch-script git-parse-remote git-verify-tag-script \
git-ls-remote-script

PROG= git-update-cache git-diff-files git-init-db git-write-tree \
git-read-tree git-commit-tree git-cat-file git-fsck-cache \

104
git-ls-remote-script Executable file
View File

@ -0,0 +1,104 @@
#!/bin/sh
#
. git-sh-setup-script || die "Not a git archive"

usage () {
echo >&2 "usage: $0 [--heads] [--tags] [--overwrite | --store] repo"
exit 1;
}

while case "$#" in 0) break;; esac
do
case "$1" in
-h|--h|--he|--hea|--head|--heads)
heads=heads; shift ;;
-o|--o|--ov|--ove|--over|--overw|--overwr|--overwri|--overwrit|--overwrite)
overwrite=overwrite; shift ;;
-s|--s|--st|--sto|--stor|--store)
store=store; shift ;;
-t|--t|--ta|--tag|--tags)
tags=tags; shift ;;
--)
shift; break ;;
-*)
usage ;;
*)
break ;;
esac
done

case "$#" in 1) ;; *) usage ;; esac
case ",$store,$overwrite," in *,,*) ;; *) usage ;; esac

case ",$heads,$tags," in
,,,) heads=heads tags=tags other=other ;;
esac

. git-parse-remote "$@"
peek_repo="$_remote_repo"

tmp=.ls-remote-$$
trap "rm -fr $tmp-*" 0 1 2 3 15
tmpdir=$tmp-d

case "$peek_repo" in
http://* | https://* )
if [ -n "$GIT_SSL_NO_VERIFY" ]; then
curl_extra_args="-k"
fi
curl -ns $curl_extra_args "$peek_repo/info/refs" || exit 1
;;

rsync://* )
mkdir $tmpdir
rsync -rq "$peek_repo/refs" $tmpdir || exit 1
(cd $tmpdir && find refs -type f) |
while read path
do
cat "$tmpdir/$path" | tr -d '\012'
echo " $path"
done &&
rm -fr $tmpdir
;;

* )
git-peek-remote "$peek_repo"
;;
esac |

while read sha1 path
do
case "$path" in
refs/heads/*)
group=heads ;;
refs/tags/*)
group=tags ;;
*)
group=other ;;
esac
case ",$heads,$tags,$other," in
*,$group,*)
;;
*)
continue;;
esac

echo "$sha1 $path"

case "$path,$store,$overwrite," in
*,,, | HEAD,*) continue ;;
esac

if test -f "$GIT_DIR/$path" && test "$overwrite" == ""
then
continue
fi

# Be careful. We may not have that object yet!
if git-cat-file -t "$sha1" >/dev/null 2>&1
then
echo "$sha1" >"$GIT_DIR/$path"
else
echo >&2 "* You have not fetched updated $path ($sha1)."
fi
done