On Thu, Jul 14, 2016 at 8:31 AM, Thorsten Glaser <t.glaser@xxxxxxxxx> wrote: > Hi *, > > is there a way, for example with some sort of pre-receive hook, > to prevent some files from being overwritten by a push? pre-receive hooks are a thing! pre-receive This hook is invoked by git-receive-pack on the remote repository, which happens when a git push is done on a local repository. Just before starting to update refs on the remote repository, the pre-receive hook is invoked. Its exit status determines the success or failure of the update. This hook executes once for the receive operation. It takes no arguments, but for each ref to be updated it receives on standard input a line of the format: <old-value> SP <new-value> SP <ref-name> LF where <old-value> is the old object name stored in the ref, <new-value> is the new object name to be stored in the ref and <ref-name> is the full name of the ref. When creating a new ref, <old-value> is 40 0. If the hook exits with non-zero status, none of the refs will be updated. If the hook exits with zero, updating of individual refs can still be prevented by the update hook. Both standard output and standard error output are forwarded to git send-pack on the other end, so you can simply echo messages for the user. As you have access to the old and new value, just check them out to /tmp and inspect the files? (That is slower than optimal I'd assume, so to get it faster you could go roughly like git ls-tree -r <oldvalue> | grep <certain dir> >old_interest git ls-tree -r <newvalue> | grep <certain dir> >new_interest if diff old_interest new_interest then echo "There is a difference in <certain dir> exit 1 fi > > Use case: > > In some project, we use Flyway to manage the database schema, > and Jenkins to automatically build master’s HEAD after each > push (and install it, thus activating the schema files almost > immediately). Now, I wish to prevent coworkers from changing > anything in the SQL subdirectory that has ever been pushed, > forcing them to push new SQL files with ALTER statements instead. > (Yes, I am aware this will likely make me even less liked. No, > this is not an issue.) > > As for the comparison, only the changes between the previous > HEAD of master and the new HEAD of master after the push would > have been accepted need to be taken into account; any intermediate > commits, merges, etc. are no problem (because Jenkins does not > build them, and because, once a push fails, the developer will > have to add a commit reverting their change and moving it to > another file on top, I’m no friend of rewriting). > > File matching would be “any files under a certain subdirectory”, > nothing fancier than that. > > I’ve tried a web search (with two different search engines) for > “git prevent pushed files from modification”, but this seems to > only show people who want to ignore local changes or somesuch… > > I’ve asked in IRC, but with no answer for hours I thought that > maybe this was the better place to ask for it. > > Thanks in advance, > //mirabilos > -- > tarent solutions GmbH > Rochusstraße 2-4, D-53123 Bonn • http://www.tarent.de/ > Tel: +49 228 54881-393 • Fax: +49 228 54881-235 > HRB 5168 (AG Bonn) • USt-ID (VAT): DE122264941 > Geschäftsführer: Dr. Stefan Barth, Kai Ebenrett, Boris Esser, Alexander Steeg > -- > 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 -- 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