summaryrefslogtreecommitdiff
path: root/git-inverse-archive
blob: 91122bfb1d92e739c570da72943c8ea98ccf0a38 (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
#!/bin/bash

if [ "x$1" = 'x-C' ]; then
  git_dir=$(readlink -e "$2")
  shift 2
else
  git_dir=$(pwd)
fi

if [ $# -ne 1 ] || [ ! -d "${git_dir}" ]; then
  printf 'usage: %s [-C /dir/ec/to/ry] archive.tar\n' "${0##*/}"
  exit 1
fi

tar_ball="$1"

tmp_dir=$(mktemp -d)
trap 'cd /; rm -rf --one-file-system "${tmp_dir}"' EXIT

cd "${tmp_dir}"
git clone -q "${git_dir}" . || exit $?
git checkout -q $(git -C "${git_dir}" rev-parse HEAD) || exit $?
git clean -qxdf .
git archive HEAD \
| tar -t \
| xargs -r rm

bsdtar -C "${tmp_dir}" -xf "${tar_ball}" --strip-components 1 || exit $?

tar_ball="${tar_ball##*/}"

git add .
git commit -qm "${tar_ball}"
git checkout -b "${tar_ball%.tar*}"
git push --set-upstream origin "${tar_ball%.tar*}"