防止一些提交/代码被合并到主机中

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

  • 在分支大师中:
  • git submodule add git@github.com:path / to / submodule.git devtool
  • 光盘devtool
  • git checkout 123abc#子模块的初始提交
  • cd ..
  • git add devtool
  • git commit -m“在初始提交时添加子模块”
  • 在分行发展:
  • 光盘devtool
  • git checkout abc213#submodule的最后提交
  • cd ..
  • git add devtool
  • git commit -m“最后提交的子模块”
  • 回到分支大师:
  • 触摸.gitattributes
  • 在.gitattributes我把这个: devtool merge=ours
  • git add .gitattributes
  • git commit -m“.gitattributes指令”
  • 但master中的子模块具有最后一次提交的内容,如果我检查master和checkout中的初始提交以开发,最初的提交仍然存在(当我想要最后一次提交时)。
    所以我显然做错了什么,但是什么?


    我真的推荐使用一个子模块来分离它自己的回购中的一组文件。

    其思想是:如果使用的是子模块,则需要在父目录中执行所有操作,以防止合并一个元素(并且仅限一个):记录所述子模块的SHA1的特殊条目。
    您不必担心子模块文件的合并。

    您可以:

  • master引用一个空的子模块SHA1
  • 引用' devel '分支中的最后一个子模块提交
  • 防止在develmaster之间合并子模块特殊条目。
    (例如,参见“使用.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”中,然后您尝试提交!
    这些文件将从提交中删除,但您可以提交一个空的“没有任何更改”提交。

    链接地址: http://www.djcxy.com/p/92275.html

    上一篇: prevent some commit/code to be merged into master

    下一篇: How to use submodules publicly, but symlinks to a single clone locally?