4

对于我正在进行的项目,我们决定开发一个工具来帮助开发,所以这不应该在生产中。
所以我想知道,因为 git 太棒了,如果可能有一个功能来阻止某些文件(是的,只有文件:这是一个 Magento 项目,我们要开发的工具将在他自己的模块中,与应用程序的其余部分)要合并到 master 中,但应该在其他分支中可用。
如果有帮助,我们正在考虑使用 git-flow。所以我们会有master,我们将从它创建develop,从中创建我们所有的功能分支。我们的想法是让这个模块处于开发状态,但永远不会合并回主模块。

我现在在想,比如只在主分支中忽略那些文件(.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
    • cd 开发工具
    • git checkout 123abc #submodule 的初始提交
    • 光盘..
    • git 添加开发工具
    • git commit -m "在初始提交时添加子模块"
  • 在分支开发中:
    • cd 开发工具
    • git checkout abc213 #子模块的最后一次提交
    • 光盘..
    • git 添加开发工具
    • git commit -m "子模块最后一次提交"
  • 回到分支主:
    • 触摸 .git 属性
    • 在 .gitattributes 我放了这个:devtool merge=ours
    • 混帐添加 .gitattributes
    • git commit -m ".gitattributes 指令"

但是master中的子模块具有最后一次提交的内容,如果我签出master中的初始提交并签出返回到develop,初始提交仍然存在(当我想要develop中的最后一次提交时)。
所以我显然做错了什么,但是什么?

4

3 回答 3

11

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

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

你可以:

于 2013-09-17T06:54:50.523 回答
2

切换分支后

git checkout <branch>,

你必须跑

git submodule update

这是为了解决您在编辑 2 中描述的问题。

根据 VonC 的回答, gitsubmodule 对象是存储库中映射到 SHA 提交的一个对象,而不是子模块本身的内容。

因此,git submodule update有必要使用此提交中的内容初始化您的本地目录。执行全新克隆或切换分支后,必须运行此命令。您遇到的问题是,当您切换分支时,最后一个分支的子模块内容仍然存在。运行 git submodule update 将这些内容替换为新分支的子模块对象指向的内容。

编辑:

运行git submodule update会使用子模块对象也指向的提交(在父仓库中)覆盖子模块中的所有当前更改。如果要更改父 repo 指向的提交,请在子模块中签出正确的版本,然后cd ..将更改提交到子模块对象。

于 2013-09-24T16:33:09.077 回答
2

最好的解决方案是使用 git hooks !

这是工作示例“我已经对其进行了测试并确保它可以正常工作”

用法 :

混帐添加。// 例如添加所有文件(包括您要排除的文件)
git commit -am 'Test pre-commit' // 提交所有文件 “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)取决于您想要的逻辑!

返回 ==> 提交将继续
退出 ===> 提交将被中止

用例:

如果添加“git-add”。并且您添加的所有文件都被排除在配置文件“.ignorefolders”中,然后您尝试提交!
这些文件将从提交中删除,但您将能够提交一个空的“没有任何更改”的提交。

于 2013-09-20T19:39:24.473 回答