Synchronize just the contents of a repository with a local directory
Synchronize (the contents of) a repository with a local directory. Can be used to manually update "embedded" repositories (aka subtree's).
Does not touch the host repository's stage or history. You have to add and commit the changed files manually. Write a good commit message and have a clean history.
Simply put git-embed somewhere in your path.
usage: git embed add <repository>
or: git embed update <directory>
$ git embed add https://github.com/you/project.git
Copy the contents of https://github.com/you/project.git into the local folder project.
$ git embed update project
Updates the local folder project with the contents of the (previously added) remote repository https://github.com/you/project.git.
#!/usr/bin/env bash
# Echo basename without extension of given URI
#
# @param 1 - URI
base()
{
local BASE=${1##*/}
BASE=${BASE%.*}
echo "$BASE"
}
# Echo URI for given basename
#
# @param 1 - basename of repository
resolve()
{
local REPO=${1%/}
while read -r
do
local BASE
BASE=$(base "$REPLY")
[ "$BASE" == "$REPO" ] || continue
echo "$REPLY"
return 0
done < "$STORE"
return 1
}
# Update embedded repository
#
# @param 1 - basename of repository to update
update()
{
local CWD BASE URI
CWD=$(pwd)
BASE=${1%/}
URI=$(resolve "$1") || return $?
local CACHE=${CACHE:-$(mktemp -d "${0##*/}.XXXXXXXXXX")}
(cd "$CACHE" &&
git clone "$URI" "$BASE" &&
rsync --exclude='.git' -a "$BASE" "$CWD/")
rm -rf "$CACHE"
}
# Embed (or update) repository
#
# @param 1 - URI of repository
add()
{
local BASE
BASE=$(base "$1")
resolve "$BASE" &>/dev/null || echo "$1" >> "$STORE"
update "$BASE"
}
# Print help
help()
{
cat <<EOF
usage: git embed add <repository>
or: git embed update <directory>
EOF
}
readonly STORE='.gitembedded'
if [ "$0" == "${BASH_SOURCE[0]}" ]
then
"${@:-help}"
fi