summaryrefslogtreecommitdiffstats
path: root/git/git-clone-into
blob: 67e820e62cdca7ab12d4b2f18741d2d40d182bf5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#! /bin/sh
#
# usage: git-clone-into repository directory
#
set -euf

tempdir() {
  set -- `tempnam $1`
  mkdir $1
  echo $1
}

## [prefix] -> tempnam
tempnam() {
  until set -- $1 ${1-}`candnam` && ! test -e $2; do :; done
  echo $2
}

candnam() {
  uuidgen 2>/dev/null || date +%s%N
}



  tmp_remote=`candnam`
  tmp_branch=`candnam`

  subdir=$2
  if test -e $subdir; then
    echo 'You are made of stupid!' >&2
    exit 23
  fi
  tmpdir=`tempdir /tmp/tempdir-`
  #trap "test -d $tmpdir && rm -vfR $tmpdir" EXIT
  trap "test -d $tmpdir && rm -fR $tmpdir" EXIT
  repository="${1-$repository}"
  git clone "$repository" $tmpdir
  (cd $tmpdir
  subdir="$subdir" git filter-branch --tree-filter '
    if ! test -d $subdir; then
      mkdir -p $subdir
      git ls-tree -z --name-only $GIT_COMMIT | xargs -I. --null mv . $subdir
    fi
  '
  git checkout -b $tmp_branch)
  git remote add $tmp_remote $tmpdir
  git fetch $tmp_remote
  git merge $tmp_remote/$tmp_branch # TODO configurable branch