Лучший способ рекурсивного игнорирования файла или шаблона каталога в SVN без глобального игнорирования - PullRequest
1 голос
/ 25 мая 2011

Часто временные файлы создаются в результате компиляции или открытия файла проекта. Я хочу, чтобы SVN игнорировал (а не версию) эти файлы там, где они были созданы, без необходимости игнорировать их глобально, так как разные программы / процессы могут создавать их в других местах, и им может потребоваться управление версиями (то же расширение с другим типом файла). Какой лучший способ сделать это, используя Bash и SVN? Достаточно ли следующего скрипта bash, который я создал?

# Recursively find, remove, and set svn:ignore on files or folders. 
# For safety, you must perform an svn status and an svn commit yourself.
#
# $1 is the pattern to ignore
# $2 is the starting directory (optional)
# $3 is a flag to remove the ignored files locally (optional)
#
# Example: recursive_svn_ignore "*.bak" . --remove
#
recursive_svn_ignore () 
{
    cd "$2";
    svn info > /dev/null 2>&1;
    if [ "$?" -ne "0" ]; then
      echo "Skipping `pwd` because it is not under version control.";
      return 1;
    fi;
    # Check if pattern matches
    ls -l $1 > /dev/null 2>&1;
    if [ "$?" = "0" ]; then
        for f in "$1"; do
            if [ "$3" = "--remove" ]; then
              # Remove file from working directory and repository 
              svn rm --force -q $f; 
            else
              # Remove file from repository only
              svn rm --force --keep-local $f;
            fi;
        done
        echo "Adding "$1" in `pwd` to svn:ignore list";
        svn propget svn:ignore . > svnignore.tempfile;
        echo "$1" >> svnignore.tempfile;
        svn propset -q svn:ignore -F svnignore.tempfile .;
        rm svnignore.tempfile;
    fi;
    # Recurse
    for d in *
    do
        if [ -d "$d" ]; then
            ( recursive_svn_ignore "$1" "$d" )
        fi;
    done
}

Как подсказывает @ david-van-brink, использование find значительно упрощает работу за счет исключения рекурсии. Это то, что я придумал.

#!/bin/bash
# Recursively find and set svn:ignore on files or folders.
# If the file was already version it will be removed from the repository
# and keep the local copy (can be overridden).
# This does not perform the final commit so you can review the changes
# using svn status.
#
# $1 pattern to ignore
# $2 remove the ignored files locally as well (optional)
#
# Example: find_svn_ignore "*.bak" . --remove
#
for a in `find . -name $1`
do
        svn info ${a%/*} > /dev/null 2>&1;
        if [ "$?" -ne "0" ]; then
                echo "Skipping ${a%/*} because it is not under version control.";
                continue;
        fi;
        echo "Ignoring ${a##*/} in ${a%/*}";
        svn propget svn:ignore ${a%/*} > svnignore.tempfile;
        echo "$1" >> svnignore.tempfile;
        svn propset -q svn:ignore -F svnignore.tempfile ${a%/*};
        rm svnignore.tempfile;
        if [ "$2" = "--remove" ]; then
                # Remove file from working directory and repository 
                svn rm --force -q ${a##*/};
        else   
                # Remove file from repository only
                svn rm --force --keep-local ${a##*/};
        fi;
done

Ответы [ 2 ]

2 голосов
/ 25 мая 2011

Использование «find» может быть лучше.Что-то вроде:

for a in `find . -name '*.bak'`
 do
     echo something $a
     echo something else to $a
 done

Или передать шаблон в качестве аргумента функции.Замени мое "эхо-то" на свою логику работы.Это просто позволяет избежать реальной рекурсии, если использовать метод «найти» таким образом.


Конечно, действительно вы должны настроить свой поток для генерации файлов где-то еще или, по крайней мере, простоодна папка «output» для аккуратности, когда это возможно, поэтому вам не нужно игнорировать постоянно растущий список файлов.

Но да, некоторые инструменты не такие аккуратные, как хотелось бы,увы.

1 голос
/ 25 мая 2011

Может быть, есть еще что-то, что вы можете сделать.

Почему бы просто запретить файлы с определенными суффиксами помещать в ваш репозиторий Subversion?

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

Это делает несколько вещей:

  • Разработчики сами добавят шаблон игнорирования.
  • Они начнут перемещать построенные объекты в другие каталоги
  • Они удостоверяются, что их чистые функции в их скриптах сборки действительно очищают весь мусор, создаваемый компиляцией.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...