Browse Source

Merge branch 'maint'

* maint:
  git-svn: don't attempt to spawn pager if we don't want one
  Supplant the "while case ... break ;; esac" idiom
  User Manual: add a chapter for submodules
  user-manual: don't assume refs are stored under .git/refs
  Detect exec bit in more cases.
  Conjugate "search" correctly in the git-prune-packed man page.
  Move the paragraph specifying where the .idx and .pack files should be
  Documentation/git-lost-found.txt: drop unnecessarily duplicated name.
maint
Junio C Hamano 18 years ago
parent
commit
4f337e2466
  1. 2
      Documentation/git-lost-found.txt
  2. 8
      Documentation/git-pack-objects.txt
  3. 2
      Documentation/git-prune-packed.txt
  4. 220
      Documentation/user-manual.txt
  5. 2
      contrib/examples/git-gc.sh
  6. 2
      contrib/examples/git-reset.sh
  7. 2
      contrib/examples/git-tag.sh
  8. 2
      contrib/examples/git-verify-tag.sh
  9. 10
      contrib/fast-import/git-p4
  10. 2
      git-am.sh
  11. 2
      git-clean.sh
  12. 2
      git-commit.sh
  13. 2
      git-fetch.sh
  14. 3
      git-filter-branch.sh
  15. 2
      git-instaweb.sh
  16. 2
      git-ls-remote.sh
  17. 2
      git-merge.sh
  18. 2
      git-mergetool.sh
  19. 6
      git-pull.sh
  20. 2
      git-quiltimport.sh
  21. 2
      git-rebase--interactive.sh
  22. 5
      git-rebase.sh
  23. 2
      git-repack.sh
  24. 2
      git-submodule.sh
  25. 2
      git-svn.perl

2
Documentation/git-lost-found.txt

@ -65,7 +65,7 @@ $ git rev-parse not-lost-anymore


Author Author
------ ------
Written by Junio C Hamano 濱野 純 <junkio@cox.net> Written by Junio C Hamano <gitster@pobox.com>


Documentation Documentation
-------------- --------------

8
Documentation/git-pack-objects.txt

@ -25,16 +25,16 @@ is efficient to access. The packed archive format (.pack) is
designed to be unpackable without having anything else, but for designed to be unpackable without having anything else, but for
random access, accompanied with the pack index file (.idx). random access, accompanied with the pack index file (.idx).


Placing both in the pack/ subdirectory of $GIT_OBJECT_DIRECTORY (or
any of the directories on $GIT_ALTERNATE_OBJECT_DIRECTORIES)
enables git to read from such an archive.

'git-unpack-objects' command can read the packed archive and 'git-unpack-objects' command can read the packed archive and
expand the objects contained in the pack into "one-file expand the objects contained in the pack into "one-file
one-object" format; this is typically done by the smart-pull one-object" format; this is typically done by the smart-pull
commands when a pack is created on-the-fly for efficient network commands when a pack is created on-the-fly for efficient network
transport by their peers. transport by their peers.


Placing both in the pack/ subdirectory of $GIT_OBJECT_DIRECTORY (or
any of the directories on $GIT_ALTERNATE_OBJECT_DIRECTORIES)
enables git to read from such an archive.

In a packed archive, an object is either stored as a compressed In a packed archive, an object is either stored as a compressed
whole, or as a difference from some other object. The latter is whole, or as a difference from some other object. The latter is
often called a delta. often called a delta.

2
Documentation/git-prune-packed.txt

@ -13,7 +13,7 @@ SYNOPSIS


DESCRIPTION DESCRIPTION
----------- -----------
This program search the `$GIT_OBJECT_DIR` for all objects that currently This program searches the `$GIT_OBJECT_DIR` for all objects that currently
exist in a pack file as well as the independent object directories. exist in a pack file as well as the independent object directories.


All such extra objects are removed. All such extra objects are removed.

220
Documentation/user-manual.txt

@ -369,6 +369,11 @@ shorthand:
The full name is occasionally useful if, for example, there ever The full name is occasionally useful if, for example, there ever
exists a tag and a branch with the same name. exists a tag and a branch with the same name.


(Newly created refs are actually stored in the .git/refs directory,
under the path given by their name. However, for efficiency reasons
they may also be packed together in a single file; see
gitlink:git-pack-refs[1]).

As another useful shortcut, the "HEAD" of a repository can be referred As another useful shortcut, the "HEAD" of a repository can be referred
to just using the name of that repository. So, for example, "origin" to just using the name of that repository. So, for example, "origin"
is usually a shortcut for the HEAD branch in the repository "origin". is usually a shortcut for the HEAD branch in the repository "origin".
@ -2189,9 +2194,9 @@ test|release)
git checkout $1 && git pull . origin git checkout $1 && git pull . origin
;; ;;
origin) origin)
before=$(cat .git/refs/remotes/origin/master) before=$(git rev-parse refs/remotes/origin/master)
git fetch origin git fetch origin
after=$(cat .git/refs/remotes/origin/master) after=$(git rev-parse refs/remotes/origin/master)
if [ $before != $after ] if [ $before != $after ]
then then
git log $before..$after | git shortlog git log $before..$after | git shortlog
@ -2216,11 +2221,10 @@ usage()
exit 1 exit 1
} }


if [ ! -f .git/refs/heads/"$1" ] git show-ref -q --verify -- refs/heads/"$1" || {
then
echo "Can't see branch <$1>" 1>&2 echo "Can't see branch <$1>" 1>&2
usage usage
fi }


case "$2" in case "$2" in
test|release) test|release)
@ -2251,7 +2255,7 @@ then
git log test..release git log test..release
fi fi


for branch in `ls .git/refs/heads` for branch in `git show-ref --heads | sed 's|^.*/||'`
do do
if [ $branch = test -o $branch = release ] if [ $branch = test -o $branch = release ]
then then
@ -2946,7 +2950,7 @@ nLE/L9aUXdWeTFPron96DLA=
See the gitlink:git-tag[1] command to learn how to create and verify tag See the gitlink:git-tag[1] command to learn how to create and verify tag
objects. (Note that gitlink:git-tag[1] can also be used to create objects. (Note that gitlink:git-tag[1] can also be used to create
"lightweight tags", which are not tag objects at all, but just simple "lightweight tags", which are not tag objects at all, but just simple
references in .git/refs/tags/). references whose names begin with "refs/tags/").


[[pack-files]] [[pack-files]]
How git stores objects efficiently: pack files How git stores objects efficiently: pack files
@ -3155,6 +3159,208 @@ a tree which you are in the process of working on.
If you blow the index away entirely, you generally haven't lost any If you blow the index away entirely, you generally haven't lost any
information as long as you have the name of the tree that it described. information as long as you have the name of the tree that it described.


[[submodules]]
Submodules
==========

This tutorial explains how to create and publish a repository with submodules
using the gitlink:git-submodule[1] command.

Submodules maintain their own identity; the submodule support just stores the
submodule repository location and commit ID, so other developers who clone the
superproject can easily clone all the submodules at the same revision.

To see how submodule support works, create (for example) four example
repositories that can be used later as a submodule:

-------------------------------------------------
$ mkdir ~/git
$ cd ~/git
$ for i in a b c d
do
mkdir $i
cd $i
git init
echo "module $i" > $i.txt
git add $i.txt
git commit -m "Initial commit, submodule $i"
cd ..
done
-------------------------------------------------

Now create the superproject and add all the submodules:

-------------------------------------------------
$ mkdir super
$ cd super
$ git init
$ for i in a b c d
do
git submodule add ~/git/$i
done
-------------------------------------------------

NOTE: Do not use local URLs here if you plan to publish your superproject!

See what files `git submodule` created:

-------------------------------------------------
$ ls -a
. .. .git .gitmodules a b c d
-------------------------------------------------

The `git submodule add` command does a couple of things:

- It clones the submodule under the current directory and by default checks out
the master branch.
- It adds the submodule's clone path to the `.gitmodules` file and adds this
file to the index, ready to be committed.
- It adds the submodule's current commit ID to the index, ready to be
committed.

Commit the superproject:

-------------------------------------------------
$ git commit -m "Add submodules a, b, c and d."
-------------------------------------------------

Now clone the superproject:

-------------------------------------------------
$ cd ..
$ git clone super cloned
$ cd cloned
-------------------------------------------------

The submodule directories are there, but they're empty:

-------------------------------------------------
$ ls -a a
. ..
$ git submodule status
-d266b9873ad50488163457f025db7cdd9683d88b a
-e81d457da15309b4fef4249aba9b50187999670d b
-c1536a972b9affea0f16e0680ba87332dc059146 c
-d96249ff5d57de5de093e6baff9e0aafa5276a74 d
-------------------------------------------------

NOTE: The commit object names shown above would be different for you, but they
should match the HEAD commit object names of your repositories. You can check
it by running `git ls-remote ../a`.

Pulling down the submodules is a two-step process. First run `git submodule
init` to add the submodule repository URLs to `.git/config`:

-------------------------------------------------
$ git submodule init
-------------------------------------------------

Now use `git submodule update` to clone the repositories and check out the
commits specified in the superproject:

-------------------------------------------------
$ git submodule update
$ cd a
$ ls -a
. .. .git a.txt
-------------------------------------------------

One major difference between `git submodule update` and `git submodule add` is
that `git submodule update` checks out a specific commit, rather than the tip
of a branch. It's like checking out a tag: the head is detached, so you're not
working on a branch.

-------------------------------------------------
$ git branch
* (no branch)
master
-------------------------------------------------

If you want to make a change within a submodule and you have a detached head,
then you should create or checkout a branch, make your changes, publish the
change within the submodule, and then update the superproject to reference the
new commit:

-------------------------------------------------
$ git checkout master
-------------------------------------------------

or

-------------------------------------------------
$ git checkout -b fix-up
-------------------------------------------------

then

-------------------------------------------------
$ echo "adding a line again" >> a.txt
$ git commit -a -m "Updated the submodule from within the superproject."
$ git push
$ cd ..
$ git diff
diff --git a/a b/a
index d266b98..261dfac 160000
--- a/a
+++ b/a
@@ -1 +1 @@
-Subproject commit d266b9873ad50488163457f025db7cdd9683d88b
+Subproject commit 261dfac35cb99d380eb966e102c1197139f7fa24
$ git add a
$ git commit -m "Updated submodule a."
$ git push
-------------------------------------------------

You have to run `git submodule update` after `git pull` if you want to update
submodules, too.

Pitfalls with submodules
------------------------

Always publish the submodule change before publishing the change to the
superproject that references it. If you forget to publish the submodule change,
others won't be able to clone the repository:

-------------------------------------------------
$ cd ~/git/super/a
$ echo i added another line to this file >> a.txt
$ git commit -a -m "doing it wrong this time"
$ cd ..
$ git add a
$ git commit -m "Updated submodule a again."
$ git push
$ cd ~/git/cloned
$ git pull
$ git submodule update
error: pathspec '261dfac35cb99d380eb966e102c1197139f7fa24' did not match any file(s) known to git.
Did you forget to 'git add'?
Unable to checkout '261dfac35cb99d380eb966e102c1197139f7fa24' in submodule path 'a'
-------------------------------------------------

You also should not rewind branches in a submodule beyond commits that were
ever recorded in any superproject.

It's not safe to run `git submodule update` if you've made and committed
changes within a submodule without checking out a branch first. They will be
silently overwritten:

-------------------------------------------------
$ cat a.txt
module a
$ echo line added from private2 >> a.txt
$ git commit -a -m "line added inside private2"
$ cd ..
$ git submodule update
Submodule path 'a': checked out 'd266b9873ad50488163457f025db7cdd9683d88b'
$ cd a
$ cat a.txt
module a
-------------------------------------------------

NOTE: The changes are still visible in the submodule's reflog.

This is not the case if you did not commit your changes.

[[low-level-operations]] [[low-level-operations]]
Low-level git operations Low-level git operations
======================== ========================

2
contrib/examples/git-gc.sh

@ -9,7 +9,7 @@ SUBDIRECTORY_OK=Yes
. git-sh-setup . git-sh-setup


no_prune=: no_prune=:
while case $# in 0) break ;; esac while test $# != 0
do do
case "$1" in case "$1" in
--prune) --prune)

2
contrib/examples/git-reset.sh

@ -11,7 +11,7 @@ require_work_tree
update= reset_type=--mixed update= reset_type=--mixed
unset rev unset rev


while case $# in 0) break ;; esac while test $# != 0
do do
case "$1" in case "$1" in
--mixed | --soft | --hard) --mixed | --soft | --hard)

2
contrib/examples/git-tag.sh

@ -14,7 +14,7 @@ username=
list= list=
verify= verify=
LINES=0 LINES=0
while case "$#" in 0) break ;; esac while test $# != 0
do do
case "$1" in case "$1" in
-a) -a)

2
contrib/examples/git-verify-tag.sh

@ -5,7 +5,7 @@ SUBDIRECTORY_OK='Yes'
. git-sh-setup . git-sh-setup


verbose= verbose=
while case $# in 0) break;; esac while test $# != 0
do do
case "$1" in case "$1" in
-v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose) -v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose)

10
contrib/fast-import/git-p4

@ -63,6 +63,14 @@ def system(cmd):
if os.system(cmd) != 0: if os.system(cmd) != 0:
die("command failed: %s" % cmd) die("command failed: %s" % cmd)


def isP4Exec(kind):
"""Determine if a Perforce 'kind' should have execute permission

'p4 help filetypes' gives a list of the types. If it starts with 'x',
or x follows one of a few letters. Otherwise, if there is an 'x' after
a plus sign, it is also executable"""
return (re.search(r"(^[cku]?x)|\+.*x", kind) != None)

def p4CmdList(cmd, stdin=None, stdin_mode='w+b'): def p4CmdList(cmd, stdin=None, stdin_mode='w+b'):
cmd = "p4 -G %s" % cmd cmd = "p4 -G %s" % cmd
if verbose: if verbose:
@ -932,7 +940,7 @@ class P4Sync(Command):
data = file['data'] data = file['data']


mode = "644" mode = "644"
if file["type"].startswith("x"): if isP4Exec(file["type"]):
mode = "755" mode = "755"
elif file["type"] == "symlink": elif file["type"] == "symlink":
mode = "120000" mode = "120000"

2
git-am.sh

@ -109,7 +109,7 @@ dotest=.dotest sign= utf8=t keep= skip= interactive= resolved= binary=
resolvemsg= resume= resolvemsg= resume=
git_apply_opt= git_apply_opt=


while case "$#" in 0) break;; esac while test $# != 0
do do
case "$1" in case "$1" in
-d=*|--d=*|--do=*|--dot=*|--dote=*|--dotes=*|--dotest=*) -d=*|--d=*|--do=*|--dot=*|--dote=*|--dotes=*|--dotest=*)

2
git-clean.sh

@ -26,7 +26,7 @@ rmrf="rm -rf --"
rm_refuse="echo Not removing" rm_refuse="echo Not removing"
echo1="echo" echo1="echo"


while case "$#" in 0) break ;; esac while test $# != 0
do do
case "$1" in case "$1" in
-d) -d)

2
git-commit.sh

@ -89,7 +89,7 @@ force_author=
only_include_assumed= only_include_assumed=
untracked_files= untracked_files=
templatefile="`git config commit.template`" templatefile="`git config commit.template`"
while case "$#" in 0) break;; esac while test $# != 0
do do
case "$1" in case "$1" in
-F|--F|-f|--f|--fi|--fil|--file) -F|--F|-f|--f|--fi|--fil|--file)

2
git-fetch.sh

@ -27,7 +27,7 @@ shallow_depth=
no_progress= no_progress=
test -t 1 || no_progress=--no-progress test -t 1 || no_progress=--no-progress
quiet= quiet=
while case "$#" in 0) break ;; esac while test $# != 0
do do
case "$1" in case "$1" in
-a|--a|--ap|--app|--appe|--appen|--append) -a|--a|--ap|--app|--appe|--appen|--append)

3
git-filter-branch.sh

@ -105,8 +105,9 @@ filter_tag_name=
filter_subdir= filter_subdir=
orig_namespace=refs/original/ orig_namespace=refs/original/
force= force=
while case "$#" in 0) usage;; esac while :
do do
test $# = 0 && usage
case "$1" in case "$1" in
--) --)
shift shift

2
git-instaweb.sh

@ -61,7 +61,7 @@ stop_httpd () {
test -f "$fqgitdir/pid" && kill `cat "$fqgitdir/pid"` test -f "$fqgitdir/pid" && kill `cat "$fqgitdir/pid"`
} }


while case "$#" in 0) break ;; esac while test $# != 0
do do
case "$1" in case "$1" in
--stop|stop) --stop|stop)

2
git-ls-remote.sh

@ -13,7 +13,7 @@ die () {
} }


exec= exec=
while case "$#" in 0) break;; esac while test $# != 0
do do
case "$1" in case "$1" in
-h|--h|--he|--hea|--head|--heads) -h|--h|--he|--hea|--head|--heads)

2
git-merge.sh

@ -122,7 +122,7 @@ merge_name () {
case "$#" in 0) usage ;; esac case "$#" in 0) usage ;; esac


have_message= have_message=
while case "$#" in 0) break ;; esac while test $# != 0
do do
case "$1" in case "$1" in
-n|--n|--no|--no-|--no-s|--no-su|--no-sum|--no-summ|\ -n|--n|--no|--no-|--no-s|--no-su|--no-sum|--no-summ|\

2
git-mergetool.sh

@ -268,7 +268,7 @@ merge_file () {
cleanup_temp_files cleanup_temp_files
} }


while case $# in 0) break ;; esac while test $# != 0
do do
case "$1" in case "$1" in
-t|--tool*) -t|--tool*)

6
git-pull.sh

@ -16,7 +16,7 @@ test -z "$(git ls-files -u)" ||
die "You are in the middle of a conflicted merge." die "You are in the middle of a conflicted merge."


strategy_args= no_summary= no_commit= squash= strategy_args= no_summary= no_commit= squash=
while case "$#,$1" in 0) break ;; *,-*) ;; *) break ;; esac while :
do do
case "$1" in case "$1" in
-n|--n|--no|--no-|--no-s|--no-su|--no-sum|--no-summ|\ -n|--n|--no|--no-|--no-s|--no-su|--no-sum|--no-summ|\
@ -46,8 +46,8 @@ do
-h|--h|--he|--hel|--help) -h|--h|--he|--hel|--help)
usage usage
;; ;;
-*) *)
# Pass thru anything that is meant for fetch. # Pass thru anything that may be meant for fetch.
break break
;; ;;
esac esac

2
git-quiltimport.sh

@ -5,7 +5,7 @@ SUBDIRECTORY_ON=Yes


dry_run="" dry_run=""
quilt_author="" quilt_author=""
while case "$#" in 0) break;; esac while test $# != 0
do do
case "$1" in case "$1" in
--au=*|--aut=*|--auth=*|--autho=*|--author=*) --au=*|--aut=*|--auth=*|--autho=*|--author=*)

2
git-rebase--interactive.sh

@ -317,7 +317,7 @@ do_rest () {
done done
} }


while case $# in 0) break ;; esac while test $# != 0
do do
case "$1" in case "$1" in
--continue) --continue)

5
git-rebase.sh

@ -122,15 +122,14 @@ finish_rb_merge () {


is_interactive () { is_interactive () {
test -f "$dotest"/interactive || test -f "$dotest"/interactive ||
while case $#,"$1" in 0,|*,-i|*,--interactive) break ;; esac while :; do case $#,"$1" in 0,|*,-i|*,--interactive) break ;; esac
do
shift shift
done && test -n "$1" done && test -n "$1"
} }


is_interactive "$@" && exec git-rebase--interactive "$@" is_interactive "$@" && exec git-rebase--interactive "$@"


while case "$#" in 0) break ;; esac while test $# != 0
do do
case "$1" in case "$1" in
--continue) --continue)

2
git-repack.sh

@ -9,7 +9,7 @@ SUBDIRECTORY_OK='Yes'


no_update_info= all_into_one= remove_redundant= no_update_info= all_into_one= remove_redundant=
local= quiet= no_reuse= extra= local= quiet= no_reuse= extra=
while case "$#" in 0) break ;; esac while test $# != 0
do do
case "$1" in case "$1" in
-n) no_update_info=t ;; -n) no_update_info=t ;;

2
git-submodule.sh

@ -251,7 +251,7 @@ modules_list()
done done
} }


while case "$#" in 0) break ;; esac while test $# != 0
do do
case "$1" in case "$1" in
add) add)

2
git-svn.perl

@ -3578,7 +3578,7 @@ sub config_pager {
} }


sub run_pager { sub run_pager {
return unless -t *STDOUT; return unless -t *STDOUT && defined $pager;
pipe my $rfd, my $wfd or return; pipe my $rfd, my $wfd or return;
defined(my $pid = fork) or ::fatal "Can't fork: $!\n"; defined(my $pid = fork) or ::fatal "Can't fork: $!\n";
if (!$pid) { if (!$pid) {

Loading…
Cancel
Save