prevent some commit/code to be merged into master
For the project I am working on, we decided to develop a tool to help the development, so this is something that should not be in production.
So I was wondering, as git is so awesome, if maybe there was a feature to prevent some files (yes, only files: this is a Magento project and the tool we are going to develop will be in his own module, no intersection with the rest of the application) to be merged into master, but should be available in other branches.
We are thinking in using git-flow, if that helps. So we would have master, from which we'll create develop, from which will create all our feature branches. The idea would be to have this module in develop but never merged back into master.
I am thinking now, something like ignoring those files (.gitignore) only in the master branch, would that work?
edit 1: project structure
I feel I have to give more info about the structure of the project, here it comes:
+ main_folder/
+ magento/
|---+ app/
| |--+ code/
| | |--+ community/
| | |--+ core/
| | |--+ local/
| | |--+ Namespace1/
| | |--+ Module1/
| | |--+ Module2/
| | |--+ Namespace2/
| | |--+ Module1/
| | |--+ Module2/
| |--+ design/
| | |--+ frontend/
| | |--+ default/
| | |--+ default/
| | |--+ layout/
| | |--+ template/
| + js/
| + lib/
+ ezpublish/
the development tool module will have to be included in the main project (only the magento part) in differents places, ie app/code/local/Namespace1/ Module3 /, app/design/frontend/layout/ dev.xml , app/design/frontend/template/ dev/tool.phtml and js/ dev/
edit 2: submodule option
exploring @VonC's answer, here is what I've done:
devtool merge=ours
but the submodule in master has the content of the last commit, and if I checkout the inital commit in master and checkout back to develop, the initial commit is still there (when I want the last commit in develop).
So I am obviously doing something wrong, but what?
I would really recommend to use a submodule to isolate a set of files in its own repo.
The idea is: if you are using a submodule, all you need to do in your parent directory is to prevent the merge of one element (and only one): the special entry recording the SHA1 of said submodule.
You don't have to worry about the merge of the submodule files.
You can:
master
devel
' branch devel
and master
. (see for instance "Is it possible to exclude specific commits when doing a git merge?", with a
.gitattributes
directive.) After switching branches with
git checkout <branch>
,
you have to run
git submodule update
This is to resolve the problem you are having as described in Edit 2.
As per VonC's answer, a gitsubmodule object is one object in the repo that maps to a SHA commit, not the contents of the submodule itself.
Thus, git submodule update
is necessary to initialize your local directory with the contents from this commit. Running this command is necessary after you do a fresh clone, or when you switch branches. The problem you are having is that when you are switching branches, the submodule contents from the last branch is still there. Run git submodule update to replace those contents with the contents pointed to by the new branch's submodule object.
EDIT:
Running git submodule update
overrides all current changes in the submodule with the commit that the submodule object is pointing too (in the parent repo). If you want to change the commit that your parent repo is pointing to, checkout the right version in the submodule, then cd ..
and commit the changes to the submodule object.
Best Solution is to use git hooks !
Here is working example " I have tested it and made sure it works fine "
Usage :
git add . // add all the files for example ( including the files you want to exclude )
git commit -am 'Test pre-commit' // commit all the files "pre-commit" hook will run
Directory Structure example
|-- ex.file
|-- module
| |-- f2.php
| |-- f3.php
| `-- file.php
`-- xml
|-- file.xml
`-- file1.xml
Create file in your git root directory and call it { .ignorefolders } with files or folders you want to exclude " example below "
/module/
/xml/file.xml
/ex.file
I have added "/" at the beginning of each line as i wanted it to be relevant to the root dir
" You can add complete folders, individual files "
Create file { pre-commit } in folder { .git/hooks } with content below
ROOTDIR=$(git rev-parse --show-toplevel) #root folder
FILENAME="$ROOTDIR/.ignorefolders" #configuration file
if [ ! -f $FILENAME ]; then
echo "File '.ignorefolders' not found!"
exit 1
fi
BRANCHES=("master") # branches array to untrack this folders and files from if you want to remove this files from more than branch for example BRANCHES=("master" "branch2" "branch3")
CURRENTBRANCH=$(git branch | sed -n -e 's/^* (.*)/1/p') #get current branch name
if [[ ! "$(declare -p BRANCHES)" =~ '['([0-9]+)']="'$CURRENTBRANCH'"' ]];then #check if the current branch is NOT in the array of the branches
exit 0
else
echo "Executing pre-commit hook in $CURRENTBRANCH Branch"
fi
function removeFromGitAdd {
PARAM="$ROOTDIR$1"
if [ -e $PARAM ]; then
#file or folder exist
if [[ -n $(git ls-files $PARAM ) ]]; then
#echo "there are files with this path added in the current commit"
git rm --cached $PARAM -r #removing this files/folders
else
#echo "There is no file"
echo ''
fi
fi
}
cat $FILENAME | while read LINE
do
#echo $LINE
removeFromGitAdd $LINE
done
Notes :
Code is well documented ( You can use exit or return ) in the conditional statements depends on the logic you want !
return ==> commit will continue
exit ===> commit will be aborted
Use-case :
If you add "git-add ." and all the files you added is excluded in the config file ".ignorefolders", Then you try to commit!
The files will be removed from the commit but you will be able to commit an empty "without any changes" commit.
下一篇: 防止一些提交/代码被合并到主机中