0

変更されたファイルを取り、それらを標準のコミットで機能するディレクトリにコピーするフックがありますが、最後の2つのコミットには変更されたファイルが含まれていないため、マージの自動コミットはそれを壊します

これが私の現在のコードです

generateChangeSet() {
    if [ ! -d $WORKDIR ];then
        mkdir $WORKDIR
    fi

    CHANGESET=$(git log -1 --name-status $oldrev $newrev | grep -v -e "^Merge" -e "^commit" -e "^Author" -e "^Date" -e "^ " -e "^$")
    if [ -z $CHANGESET ]; then
      echo Could not detect any files in the change set, aborting push
      exit $RETVAL
    fi

    # Get a list of deleted files
    DELFILES=$WORKDIR/deletedFiles.sh
    if [ -f $DELFILES ];then
        rm -rf $DELFILES
    fi

    for dFile in $(echo $CHANGESET | grep "^D" | awk '{print $2}'); do
        echo deleted file $dFile
        echo rm -f $dFile >> $DELFILES
    done
    if [ -f $DELFILES ];then
        sed -i '1s/^/#!\/bin\/bash\n/' $DELFILES
        chmod +x $DELFILES
        echo find . -depth -type d -empty >> $DELFILES
        echo rm deletedFiles.sh >> $DELFILES
    fi

    echo "Generating diff between $newrev and $oldrev"
    git archive HEAD $(echo $CHANGESET | grep -v "^D" | awk '{print $2}') | (cd $WORKDIR && tar xf -)
}

スクリプトが最新の変更されたファイルを常に取得する方法についてのアイデアはありますか?

ありがとう

4

1 に答える 1

1

$WORKDIR最初に、ターゲット ( ?) がここで計算されているデルタと同期していない可能性があることを心配することから始めます。シェル スクリプトを介して削除がエクスポートされるのはなぜですか? なぜgit checkout直接新しいターゲットにしないのですか(これを行うように設定さGIT_WORK_TREEれています)、例えば:

what_to_replace=/some/where/tree
tmp_replacement=/some/where/tree.new

rm -rf $tmp_replacement
mkdir $tmp_replacement || fatal "can't create $tmp_replacement"

GIT_WORK_TREE=$tmp_replacement git checkout master -- . ||
    fatal "can't create updated master branch tree"
mv $what_to_replace ${what_to_replace}.old &&
    mv $tmp_replacement $what_to_replace ||
    fatal "can't swap in $tmp_replacement"
rm -rf ${what_to_replace}.old ||
    warn "can't clean up ${what_to_replace}.old"

(おそらく、何らかのロックを追加し、さらに肉付けする必要があります)。しかし、既存のコードをそのまま使用することに決めた場合 (そうする理由がいくつかある可能性があります)、この部分はばかげています。

CHANGESET=$(git log -1 --name-status $oldrev $newrev | grep -v -e "^Merge" -e "^commit" -e "^Author" -e "^Date" -e "^ " -e "^$")

代わりにgit diff-tree --name-status $oldrev $newrev、特定のコミットに関連付けられたツリーを比較するために使用します。残りは簡単なはずです。$oldrevもちろん、これはすべて、更新されているものの状態を正確に反映していることを前提としています。

于 2013-09-23T20:06:29.763 に答える