mirror of
https://github.com/git/git
synced 2024-08-27 11:39:22 +00:00
[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>
This commit is contained in:
parent
508e67ab6e
commit
0fec082272
3
Makefile
3
Makefile
|
@ -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
104
git-ls-remote-script
Executable 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
|
Loading…
Reference in a new issue