我想找到一个有效的方式来同步文件之间的git存储库和目标目录。本例中的目标目录是由ptxdist管理的嵌入式linux发行版的构建位置。
我经常构建不同版本的发行版,所以我将各种git代码库设置为相应的提交,对构建树执行rsync,然后构建发行版。这种方法的问题是,rsync从一个提交中留下了可能在另一个提交中不存在的文件,并可能导致代码混淆。
我可以将发行版作为git存储库,并将git放入其中,但我不需要跟踪我正在构建的内容。
最佳选择似乎是使用git-archive创建git repos的tar文件,删除目标目录,然后将tar文件解压缩到目标目录。然而,如果只有几个文件在进入发行版的所有文件中进行了更改,这似乎效率很低。
我想要的是一种像rsync --delete或者unison -prefer这样的方式,将文件放在git存储库中,而不是git工作目录中,因为我想保留一些未跟踪的文件。
更新
下面是我使用的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 "$@"发布于 2014-06-20 02:38:21
如果你“可以把发行版做成git仓库,然后把git拉进去”,这意味着:
您可以:
在服务器上创建一个空的repo /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之后更新(添加/修改/删除)跟踪的文件。
https://stackoverflow.com/questions/24313368
复制相似问题