Hi, it seems to me that in this sequence: git ls-files -m | git checkout-index --stdin -m c-i should never complain that a file isn't in the cache, but that's exactly what this script produces for me: -8<---------- #!/bin/sh rm -rf reproduce-c-i-weirdity git init --template= reproduce-c-i-weirdity cd reproduce-c-i-weirdity mkdir content mkdir deployment echo '*/' >>.gitignore echo '!content/' >>.gitignore echo deployme >>content/deployme git add . git commit -m- git init --template= --bare test.git git remote add test $PWD/test.git mkdir test.git/hooks cat >test.git/hooks/pre-receive <<\EOD #!/bin/sh -x while read old new ref; do [[ $ref = refs/heads/master ]] && { export GIT_WORK_TREE=../deployment export GIT_INDEX_FILE=deployment-manifest git read-tree -um `git write-tree` $new:content \ || { git ls-files -m | tee /dev/stderr | git checkout-index -f --stdin; git read-tree -um `git write-tree` $new:content; } \ || exit $? } done EOD chmod +x test.git/hooks/pre-receive git push test master echo nonono > deployment/deployme echo yesyes > content/deployme git commit -am- git push test master ->8------------------- read-tree and ls-files can both find the file and see that it's changed, so why not checkout-index? -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html