防止某些提交/代码合并到主服务器

时间:2013-09-16 17:52:48

标签: git magento merge git-merge git-flow

对于我正在进行的项目,我们决定开发一种工具来帮助开发,因此这不应该在生产中。
所以我想知道,因为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,这就是我所做的:

    分行主人中的
    • git submodule add git@github.com:path / to / submodule.git devtool
    • cd devtool
    • git checkout 123abc #submodule的初始提交
    • cd ..
    • git add devtool
    • git commit -m“在初始提交时添加了子模块”
  • 分行开发中的
    • cd devtool
    • git checkout abc213 #submodule的最后一次提交
    • cd ..
    • git add devtool
    • git commit -m“submodule at last commit”
  • 回到分公司主人:
    • 触摸.gitattributes
    • in .gitattributes我把这个:devtool merge=ours
    • git add .gitattributes
    • git commit -m“.gitattributes directive”

但是master中的子模块具有最后一次提交的内容,如果我检查master中的inital commit并将checkout返回开发,那么初始提交仍然存在(当我想要开发时的最后一次提交时)。 /> 所以我显然做错了什么,但是什么?

3 个答案:

答案 0 :(得分:11)

我真的建议使用submodule在自己的仓库中隔离一组文件。

这个想法是:如果你使用的是子模块,你需要在父目录中做的就是阻止一个元素(只有一个)的合并:special entry记录所述子模块的SHA1 您不必担心子模块文件的合并。

你可以:

答案 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

在您的git根目录中创建文件,并使用要排除的文件或文件夹将其命名为{.ignorefolders}"以下示例"

/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

注意:

条件语句中的代码记录良好(您可以使用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 ..并将更改提交给子模块对象。