防止一些提交/代码被合并到主机中
对于我正在开展的项目,我们决定开发一种工具来帮助开发,所以这是不应该在生产中的。
所以我想知道,因为git非常棒,如果可能有一个功能来防止某些文件 (是的,只有文件:这是一个Magento项目,我们将开发的工具将在他自己的模块中,应用程序的其余部分)被合并为主,但应在其他分支中可用。
如果有帮助,我们正在考虑使用git-flow。 所以我们会有主人,从中我们将创造发展,从中将创建所有的功能分支。 这个想法应该是让这个模块得到发展,但从来没有合并回到主模块。
我在想,现在只是在主分支中忽略这些文件(.gitignore),这是否会起作用?
编辑1:项目结构
我觉得我必须提供有关该项目结构的更多信息,这里是:
+ main_folder/
+ magento/
|---+ app/
| |--+ code/
| | |--+ community/
| | |--+ core/
| | |--+ local/
| | |--+ Namespace1/
| | |--+ Module1/
| | |--+ Module2/
| | |--+ Namespace2/
| | |--+ Module1/
| | |--+ Module2/
| |--+ design/
| | |--+ frontend/
| | |--+ default/
| | |--+ default/
| | |--+ layout/
| | |--+ template/
| + js/
| + lib/
+ ezpublish/
开发工具模块必须包含在不同地方的主项目(只有magento部分)中,即app / code / local / Namespace1 / Module3 /,app / design / frontend / layout / dev.xml ,app / design / frontend / template / dev / tool.phtml和js / dev /
编辑2:子模块选项
探索@ VonC的答案,这就是我所做的:
devtool merge=ours
但master中的子模块具有最后一次提交的内容,如果我检查master和checkout中的初始提交以开发,最初的提交仍然存在(当我想要最后一次提交时)。
所以我显然做错了什么,但是什么?
我真的推荐使用一个子模块来分离它自己的回购中的一组文件。
其思想是:如果使用的是子模块,则需要在父目录中执行所有操作,以防止合并一个元素(并且仅限一个):记录所述子模块的SHA1的特殊条目。
您不必担心子模块文件的合并。
您可以:
master
引用一个空的子模块SHA1 devel
'分支中的最后一个子模块提交 devel
和master
之间合并子模块特殊条目。 (例如,参见“使用
.gitattributes
指令可以在执行git合并时排除特定提交吗?”)。 切换分支后
git checkout <branch>
,
你必须跑步
git submodule update
这是为了解决您遇到的问题,如编辑2中所述。
根据VonC的回答,gitsubmodule对象是repo中映射到SHA提交的一个对象,而不是子模块本身的内容。
因此, git submodule update
对于使用此提交的内容初始化本地目录是必需的。 在完成新克隆或切换分支后,运行此命令是必需的。 您遇到的问题是,当您切换分支时,最后一个分支的子模块内容仍然存在。 运行git submodule update将这些内容替换为新分支的子模块对象所指向的内容。
编辑:
运行git submodule update
会覆盖git submodule update
当前所有的更改,同时提交子模块对象也指向(在父回购中)。 如果您想要更改您父级回购指向的提交,请检查子模块中的正确版本,然后cd ..
并将更改提交到子模块对象。
最好的解决方案是使用git钩子!
这里是工作示例“我测试了它并确保它正常工作”
用法:
git add。 //例如添加所有文件(包括要排除的文件)
git commit -am'测试预先提交'//提交所有文件“pre-commit”挂钩将运行
目录结构示例
|-- ex.file
|-- module
| |-- f2.php
| |-- f3.php
| `-- file.php
`-- xml
|-- file.xml
`-- file1.xml
在你的git根目录下创建文件,并用你想排除的文件或文件夹将它命名为{.ignorefolders}“example below”
/module/
/xml/file.xml
/ex.file
我在每行的开头添加了“/”,因为我希望它与根目录相关
“你可以添加完整的文件夹,单个文件”
使用下面的内容在文件夹{.git / hooks}中创建文件{pre-commit}
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
备注:
代码是有据可查的(你可以使用退出或返回)在条件语句取决于你想要的逻辑!
返回==>提交将继续
退出===>提交将被中止
用例:
如果你添加“git-add”。 并且您添加的所有文件都被排除在配置文件“.ignorefolders”中,然后您尝试提交!
这些文件将从提交中删除,但您可以提交一个空的“没有任何更改”提交。
上一篇: prevent some commit/code to be merged into master
下一篇: How to use submodules publicly, but symlinks to a single clone locally?