排除.gitignore中包含特定文件

时间:2018-04-08 10:46:36

标签: git gitignore modelica openmodelica

OpenModelica中删除包(例如Examples)时,不会删除基础目录。相反,目录Examples包含一个名为package.bak-mo的文件,表示该目录不再使用。所以保留备份。如果文件夹中存在文件package.bak-mo,则应从git提交过程中排除此文件夹及其文件。

├── Sub1
│   └── package.mo
│   └── package.order
│   └── Examples
│       └── package.bak-mo
│       └── otherfile.mo
│       └── package.order
├── Sub2
│   └── package.mo
│   └── package.order
│   └── Demo
│       └── otherfile.mo
│       └── package.mo
│       └── package.order

在此示例中,以下目录和文件应从git commit中排除:

│   └── Examples
│       └── package.bak-mo
│       └── otherfile.mo
│       └── package.order

所有其他文件和目录仍应包含在可能的git提交中。

注意:此问题由https://trac.openmodelica.org/OpenModelica/ticket/4854

触发

我无法弄清楚如何使这个工作。这里有什么想法?

2 个答案:

答案 0 :(得分:5)

这可以通过预提交钩子来完成。创建钩子运行

$ touch .git/hooks/pre-commit  
$ chmod a+x .git/hooks/pre-commit   

添加以下代码

#!/bin/bash
path_with_pattern=$(git diff --cached --find-copies --find-renames --name-only --diff-filter=ACR | grep "\.bak-mo$")
if [[ -n $path_with_pattern  ]];
then
  for path in $path_with_pattern; do
    folder=$(echo $path | sed 's/\/[^\/]*\.bak-mo$//')
    echo "Found OpenModelica backup folder: $folder"
    git reset HEAD $folder
    echo "Unstaged: $folder"
    rm -rf $folder  # Consider adding some confirmation here (use at your own risk)
    echo "Removed: $folder"
    # or safer option add to .gitignore instead of removing
    # echo $folder >> .gitignore
  done
fi

警告:此代码需要更多测试我没有根据需要测试此代码(仅针对您提供的示例)

答案 1 :(得分:2)

gitignore pattern format这是不可能的,这基本上是一个稍微扩展的通配语法(据我所知)。

另请注意,已提交但随后匹配忽略模式的文件仍保留在回购中,如this note所述。要停止跟踪当前跟踪的文件,您必须使用git rm --cached

因此,您可能无法避免使用shell脚本或某些实现为git hook的脚本来实现您想要的目标。