]>
Commit | Line | Data |
---|---|---|
303e5f4c | 1 | #!/bin/sh |
b33e9666 LT |
2 | . git-sh-setup-script || die "Not a git archive" |
3 | ||
303e5f4c | 4 | old=$(git-rev-parse HEAD) |
e8b11749 | 5 | new= |
a79944d7 | 6 | force= |
e8b11749 | 7 | branch= |
91dcdfd3 | 8 | newbranch= |
e8b11749 LT |
9 | while [ "$#" != "0" ]; do |
10 | arg="$1" | |
11 | shift | |
12 | case "$arg" in | |
91dcdfd3 LT |
13 | "-b") |
14 | newbranch="$1" | |
15 | shift | |
16 | [ -z "$newbranch" ] && | |
17 | die "git checkout: -b needs a branch name" | |
18 | [ -e "$GIT_DIR/refs/heads/$newbranch" ] && | |
19 | die "git checkout: branch $newbranch already exists" | |
20 | ;; | |
303e5f4c | 21 | "-f") |
e8b11749 | 22 | force=1 |
303e5f4c LT |
23 | ;; |
24 | *) | |
f6e1a4d6 | 25 | rev=$(git-rev-parse --verify "$arg^0") || exit |
e8b11749 LT |
26 | if [ -z "$rev" ]; then |
27 | echo "unknown flag $arg" | |
28 | exit 1 | |
29 | fi | |
30 | if [ "$new" ]; then | |
31 | echo "Multiple revisions?" | |
32 | exit 1 | |
33 | fi | |
34 | new="$rev" | |
9661c256 | 35 | if [ -f "$GIT_DIR/refs/heads/$arg" ]; then |
e8b11749 LT |
36 | branch="$arg" |
37 | fi | |
38 | ;; | |
303e5f4c LT |
39 | esac |
40 | i=$(($i+1)) | |
41 | done | |
dc148411 | 42 | [ -z "$new" ] && new=$old |
303e5f4c | 43 | |
91dcdfd3 LT |
44 | # |
45 | # If we don't have an old branch that we're switching to, | |
46 | # and we don't have a new branch name for the target we | |
47 | # are switching to, then we'd better just be checking out | |
48 | # what we already had | |
49 | # | |
50 | [ -z "$branch$newbranch" ] && | |
51 | [ "$new" != "$old" ] && | |
52 | die "git checkout: you need to specify a new branch name" | |
53 | ||
a79944d7 | 54 | if [ "$force" ] |
303e5f4c LT |
55 | then |
56 | git-read-tree --reset $new && | |
a79944d7 | 57 | git-checkout-cache -q -f -u -a |
303e5f4c | 58 | else |
a79944d7 | 59 | git-read-tree -m -u $old $new |
ef0bfa25 LT |
60 | fi |
61 | ||
62 | # | |
63 | # Switch the HEAD pointer to the new branch if it we | |
64 | # checked out a branch head, and remove any potential | |
65 | # old MERGE_HEAD's (subsequent commits will clearly not | |
66 | # be based on them, since we re-set the index) | |
67 | # | |
68 | if [ "$?" -eq 0 ]; then | |
91dcdfd3 LT |
69 | if [ "$newbranch" ]; then |
70 | echo $new > "$GIT_DIR/refs/heads/$newbranch" | |
71 | branch="$newbranch" | |
72 | fi | |
ef0bfa25 LT |
73 | [ "$branch" ] && ln -sf "refs/heads/$branch" "$GIT_DIR/HEAD" |
74 | rm -f "$GIT_DIR/MERGE_HEAD" | |
75 | fi |