Исключить каталоги в .gitignore, которые содержат определенный файл

avatar
christiankral
8 апреля 2018 в 10:46
997
2
5

Когда посылка, т.е. Examples, удаляется в OpenModelica, базовый каталог не удаляется. Вместо этого каталог 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

.

Я не мог понять, как заставить это работать. Любые идеи здесь?

Источник
Moti Korets
8 апреля 2018 в 10:54
3

Я не думаю, что это возможно с простым шаблоном игнорирования. Возможно, написание сценария перед фиксацией, который игнорирует эти папки, является решением. Думаешь, это сработает для тебя?

LeGEC
8 апреля 2018 в 21:28
0

Некоторые уточнения по поводу «должны быть исключены из коммита git»: вы хотите: 1. удалить все остальные файлы в каталоге из вашего следующего коммита? 2. сохранить другие существующие файлы, просто никогда не вносить в них какие-либо изменения?

christiankral
9 апреля 2018 в 08:12
0

@MotiKorets Я согласен, что это может быть хорошим вариантом. Сценарий предварительной фиксации может даже удалить неиспользуемый каталог, чтобы для OpenModelica я мог сохранить чистый репозиторий.

christiankral
9 апреля 2018 в 08:14
1

На самом деле я запросил новую функцию OpenModelica в trac.openmodelica.org/OpenModelica/ticket/4854, что может быть эквивалентно использованию сценария предварительной фиксации.

christiankral
9 апреля 2018 в 08:14
0

@LeGEC Вариант 1. Мой выбор здесь.

matth
28 ноября 2018 в 12:31
0

У Димолы есть флаг Advanced.AutoDeleteDirectories, который, кажется, делает именно это! Может быть, у OpenModelica должен быть аналогичный флаг/настройка?

Ответы (2)

avatar
Moti Korets
9 апреля 2018 в 08:36
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

Внимание: этот код нуждается в дополнительном тестировании. Я не тестировал этот код в достаточной степени (только на приведенном вами примере)

Christoph
9 апреля 2018 в 08:59
1

Обратите внимание, что добавление папки в gitignore после того, как она уже находится в репо, не повлияет, см. мой ответ (gitignore влияет только на файлы/каталоги, которые еще не отслеживаются).

christiankral
9 апреля 2018 в 09:53
0

@MotiKorets Я попробовал ваш хук перед фиксацией, используя echo $mo_backup_folders | xargs rm -rf, но, к сожалению, он также удаляет каталог Sub1, который должен быть сохранен. Только каталог Examples должен быть удален.

christiankral
9 апреля 2018 в 09:54
0

Я не настолько хорош в программировании на bash, чтобы это сделать; @MotiKorets у тебя есть предложение для меня? Спасибо.

christiankral
9 апреля 2018 в 10:43
0

Это эхо .git/hooks/pre-commit: 3: .git/hooks/pre-commit: [[: not found; такое бывает и при ручном запуске скрипта .git/hooks/pre-commit

christiankral
9 апреля 2018 в 10:45
0

Что происходит, когда пакет Examples удаляется. Исходный файл Sub1/Examples/package.mo переименовывается в Sub1/Examples/package.bak-mo.

avatar
Christoph
8 апреля 2018 в 16:33
2

Это невозможно сделать с помощью формата шаблона gitignore, который в основном представляет собой слегка расширенный синтаксис подстановки (насколько мне известно).

Кроме того, обратите внимание, что файлы, которые уже были зафиксированы, но впоследствии соответствуют шаблону игнорирования, остаются в репозитории, как объясняется в этом примечании. Чтобы остановить отслеживание файла, который в настоящее время отслеживается, вы должны использовать git rm --cached.

Поэтому, вы, вероятно, не сможете избежать сценария оболочки или чего-то подобного, реализованного в виде git hook для достижения желаемого.