对于我正在进行的项目,我们决定开发一种工具来帮助开发,因此这不应该在生产中。
所以我想知道,因为git太棒了,如果有一个功能可以防止一些文件(是的,只有文件:这是一个Magento项目,我们将要开发的工具将在他自己的模块,与应用程序的其余部分没有交集)要合并到master中,但应该在其他分支中可用
我们正在考虑使用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的answer,这就是我所做的:
devtool merge=ours
但是master中的子模块具有最后一次提交的内容,如果我检查master中的inital commit并将checkout返回开发,那么初始提交仍然存在(当我想要开发时的最后一次提交时)。 /> 所以我显然做错了什么,但是什么?
答案 0 :(得分:11)
我真的建议使用submodule在自己的仓库中隔离一组文件。
这个想法是:如果你使用的是子模块,你需要在父目录中做的就是阻止一个元素(只有一个)的合并:special entry记录所述子模块的SHA1 您不必担心子模块文件的合并。
你可以:
master
devel
”分支中的最后一个子模块提交devel
和master
之间合并submodule special entry
(例如,参见“Is it possible to exclude specific commits when doing a git merge?”,并附带.gitattributes
指令。)答案 1 :(得分:2)
最佳解决方案是使用git hooks!
以下是工作示例"我测试了它并确保它工作正常"
git add。 //例如添加所有文件(包括您要排除的文件)
git commit -am'测试预先提交' //提交所有文件" pre-commit"钩子会运行
目录结构示例
|-- ex.file
|-- module
| |-- f2.php
| |-- f3.php
| `-- file.php
`-- xml
|-- file.xml
`-- file1.xml
/module/
/xml/file.xml
/ex.file
我添加了" /"在每一行的开头,因为我希望它与根目录相关 "您可以添加完整的文件夹,单个文件"
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
条件语句中的代码记录良好(您可以使用exit或return)取决于您想要的逻辑!
return ==>承诺将继续 退出===>提交将被中止
如果您添加" git-add。"并且您添加的所有文件都被排除在配置文件" .ignorefolders"中,然后您尝试提交!
这些文件将从提交中删除,但您可以提交一个空的"没有任何更改"提交。
答案 2 :(得分:2)
用
切换分支后 git checkout <branch>
,
你必须运行
git submodule update
这是为了解决您在编辑2中所述的问题。
根据VonC的回答,gitsubmodule对象是repo中映射到SHA提交的一个对象,而不是子模块本身的内容。
因此,git submodule update
是使用此提交中的内容初始化本地目录所必需的。执行新克隆或切换分支后,必须运行此命令。您遇到的问题是,当您切换分支时,最后一个分支的子模块内容仍然存在。运行git submodule update,用新分支的子模块对象指向的内容替换这些内容。
编辑:
运行git submodule update
会覆盖子模块中所有当前更改,并且子模块对象也指向该提交(在父存储库中)。如果要更改父repo指向的提交,请在子模块中签出正确的版本,然后cd ..
并将更改提交给子模块对象。