我想找到一种在git repo和目标目录之间同步文件的有效方法。在这种情况下,目标目录是由ptxdist管理的嵌入式Linux发行版的构建位置。
我经常构建各种版本的发行版,所以我将各种git repos设置为相应的提交,对构建树执行rsync,并构建发行版。这种方法的问题在于rsync会从一次提交中留下文件,这些文件可能在另一次提交中不存在,并且可能会导致代码混淆。
我可以让发行版成为一个git存储库并且git拉入其中但是我不需要跟踪我正在构建的内容。
最好的候选人似乎是使用git-archive来创建git repos的tar文件,删除目标目录,然后将tar文件解压缩到目标目录。但是,如果只有少数文件已经改变了发行版的所有内容,这似乎效率低下。
我想要的是使用git存储库中的文件而不是git工作目录来执行类似rsync --delete
或者unison -prefer
之类的操作的方法,因为我有未跟踪的文件我想要保留周围。
更新
这是我用过的bash脚本,可以完成所需的操作,
#!/usr/bin/env bash
# Does one way sync between commit and target directory where the target
# directory is not a git archive.
# USAGE: git-archive-commit <source directory> <target directory> [<treeish>] [-- <paths>...]
set -e
sourceDir="$(readlink -f $1)"
targetDir="$(readlink -f $2)"
shift; shift
checkoutArgs="$@"
gitSetup="--work-tree=$targetDir --git-dir=$sourceDir/.git"
function gitStash {
pushd . > /dev/null 2>&1
cd $targetDir
git $gitSetup stash -q
git $gitSetup stash drop -q > /dev/null 2>&1
popd > /dev/null 2>&1
}
if [ $# -gt 0 ]; then
if [ $1 != "--" ]; then
if [ $# = 1 ]; then
gitStash
fi
git $gitSetup checkout $checkoutArgs
shift
else
git $gitSetup checkout $checkoutArgs
fi
else
gitStash
git $gitSetup checkout
fi
git $gitSetup clean -df "$@"
答案 0 :(得分:1)
如果您&#34;可以使发行版成为git存储库并将git拉入&#34;,这意味着:
你可以:
/path/to/myrepo.git
/path/to/myrepo.git/hooks/post-update
每次拉动后,更新后的脚本都可以触发:
git --work-tree=/path/to/target/directory --git-dir=/path/to/myrepo.git checkout HEAD
这会忽略未跟踪的文件,但会在每个git pull
之后更新(添加/修改/删除)跟踪的文件。