git repo和非git目录之间的同步

时间:2014-06-19 17:59:58

标签: git

我想找到一种在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 "$@"

1 个答案:

答案 0 :(得分:1)

如果您&#34;可以使发行版成为git存储库并将git拉入&#34;,这意味着:

  • git在服务器上可用(或可以)
  • 服务器可以联系客户端(反之则不然)

你可以:

  • 在服务器/path/to/myrepo.git
  • 上制作一个裸仓库
  • 在其中设置更新后的挂钩:/path/to/myrepo.git/hooks/post-update
  • git pull

每次拉动后,更新后的脚本都可以触发:

git --work-tree=/path/to/target/directory --git-dir=/path/to/myrepo.git checkout HEAD

这会忽略未跟踪的文件,但会在每个git pull之后更新(添加/修改/删除)跟踪的文件。