2010-09-17 2 views
3

У меня всегда возникают проблемы с svn: ignore, но на этот раз я думаю, что могу пытаться что-то невозможное.svn: игнорировать сгенерированные подпапки

предполагая реж структуру:

/ 
    /foo 
    /bar 
    /web 
     /uploads 
      /assets 
      /avatars 
       /fu 
        /*.jpg 
       /ba 
        /*.jpg 
       keepme.jpg 
       keepmetoo.jpg 

Я хочу быть игнорировать все вложенные папки каталога аватаров но не файлы этого каталога (keepme.jpg, keepmetoo.jpg).

Вложенные папки аватара (fu, ba) генерируются автоматически и имена не могут быть предопределены, поэтому необходимо полностью игнорировать все вложенные папки/аватары.

Возможно ли это? и как?

Редактировать Мы бы предпочли не использовать крюки после фиксации. Это просто вопрос предпочтения. У нас есть много хорошо зарекомендовавших себя приложений и разработали стандартизованный способ делать что-то, и перехватывать фиксации, которые еще не были использованы. Мы бы просто не добавили лишних дополнительных движущихся частей. Честно говоря, более вероятно, что мы рассмотрим структуру каталогов (которая представляет собой небольшую задачу), прежде чем рассматривать добавление перехватов после коммита.

+0

Добавить щедрость на ваш вопрос, если вы хотите заинтересовать ее. – Will

+0

@ulidtko: tbh проблема действительно старая, и я не могу вспомнить, почему именно так должно было быть. Утром я уточню вопрос более подробно. Что касается неудобного использования систем VCS, вы правы, но из-за памяти у нас были некоторые ограничения макета каталога из-за используемой структуры и первоначальной реализации. Извините, я не могу быть более конкретным. – xzyfer

+0

См. Http://stackoverflow.com/questions/4889375/svn-ignore-subfolders –

ответ

2

Вы хотите сохранить весь лот в svn, except/avataurs/fu и avatars/ba (на самом деле все аватары/ххх)?

Необходимо сначала добавить оставшуюся структуру каталогов в svn. Используйте Tortoise, чтобы добавить корневой каталог, отменить каталоги, которые вы не хотите добавлять, а затем зафиксировать. что решает начальную проблему - не совершать оскорбительные подкаталоги, все хорошо.

Кроме того, следующая проблема заключается в том, что вы не хотите, чтобы кто-либо еще «случайно» добавлял вновь сгенерированные подкаталоги - в этом случае необходим крюк предварительной фиксации. Они очень просты - вам нужно всего лишь написать быстрый командный файл или perl-скрипт, который делает isgex на путях входящих файлов, и возвращает 1, если они содержат ".*/avatars/.*/.*" (что позволит допустить добавление новых файлов в этот каталог) , Крючок также может возвращать текст, который будет отображаться для пользователя, который добавлял файлы. Я использую его для предотвращения проверки файлов с расширением файла в списке запретов (например, .obj и т. Д.).

Если аватарные субдиры никогда не попадают в SVN, вы никогда не проверите их - очевидно - и ваша работа будет выполнена!


Вот копия файла pre-commit.cmd hook. Просто поместите его в каталог ваших крючков (на окнах), и вам хорошо идти.

@echo off 

svnlook changed -t %2 %1 > c:\temp\pre-commit.txt 

findstr /G:"%1\hooks\ignore-matches.txt" c:\temp\pre-commit.txt > c:\temp\precommit-bad.txt 
if %ERRORLEVEL% NEQ 0 exit 0 

echo disallowed file extension >> c:\temp\precommit-bad.txt 

type c:\temp\precommit-bad.txt 1>&2 
exit 1 

файл игнорируемых matches.txt содержит такие строки:

^[^D].*\.obj$ 

все, что соответствует записи в игнорируемых matches.txt файла означает коммит отвергается, пользователь должен будет повторите попытку, правильно на этот раз.

+0

Насколько переносимы перехватывающие крючки? Я сам с ними не знаком, поэтому приношу извинения за последующие вопросы n00bish. Выполняйте скрипты hook в самой конфигурации repo или каждый пользователь несет ответственность за настройку крючков в своей локальной проверке. Прошу, потому что мы используем смесь tortisesvn на окнах и командную строку svn в ubuntu. – xzyfer

+0

- это серверная, репо-конфигурация. Посмотрите на свое репо, вы увидите каталог hooks с некоторыми шаблонами шаблонов, которые уже там, ожидая переименования в исполняемый скрипт. http://svnbook.red-bean.com/nightly/en/svn.reposadmin.create.html#svn.reposadmin.create.hooks – gbjbaanb

1

Короче говоря, с конфигом только чистый SVN это невозможно. Но у вас есть несколько вариантов для настройки этих свойств, а также для проверки их, как

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

На стороне сервера, вы можете

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

Во-первых, я бы рекомендовал автоматически обновлять свойство svn: ignore после автоматического генерации папок. Самый простой способ - вызывать пакетный файл после создания. Сама партия-файл будет просто:

@echo off 
echo.>~svnignore 
dir /b /aD >~svnignore 
svn propset svn:ignore --file ~svnignore . 
del ~svnignore 

Конечно, файл ~svnignore должен быть именем, которое вы можете гарантировать, чтобы не использовать что-нибудь еще. Если это вызвано автоматически после поколения, это должно работать для всех.

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

Наконец, у вас есть другой вариант, хотя я бы не стал рекомендовать этот маршрут: поскольку вы отметили вопрос tortoisesvn, я полагаю, вы используете этот инструмент.Это дает вам дополнительную возможность использовать клик для предварительной фиксации на стороне клиента. Для этого перейдите в диалог настроек TortoiseSVN. В левом дереве вы найдете запись Hook Scripts, где вы можете настроить некоторые исполняемые файлы (например, пакетные файлы ...), которые будут выполняться в определенное время, например, на pre-commit времени.

Недостатком этого является то, что вы практически разрушаете использование консоли в SVN, и если вы хотите иметь некоторую автоматизацию для некоторых сборников/тэгов и т. Д., Это будет бесполезно.

+0

Мы используем как tortisesvn, так и командную строку непосредственно в оболочке ubuntu, так как вы отметили, что последняя опция не используется. Редактирование svn: ignore при запуске автогенерации не является жизнеспособным, так как эти каталоги удаляются и создаются несколько раз в день. И, к сожалению, независимо от того, насколько умный разработчик, каждый делает ошибку в конце концов :) Я действительно верю, что перехватывающие крючки могут быть способом пойти – xzyfer

+0

Насколько портативны перехватывающие крючки? Я сам с ними не знаком, поэтому приношу извинения за последующие вопросы n00bish. Выполняйте скрипты hook в самой конфигурации repo или каждый пользователь несет ответственность за настройку крючков в своей локальной проверке. Прошу, потому что мы используем смесь tortisesvn на окнах и командную строку svn в ubuntu. – xzyfer

+1

Во-первых, я хочу добавить, что запуск сценария «set-svn-ignore» несколько раз в день не представляет проблемы - он практически не работает. Во-вторых, скрипты hook являются серверными, частью конфигурации репо и являются системными (cmd vs.bash), но с помощью оболочки unix (а на окнах используется mingw/msys/etc.) + svnlook, часть, относящаяся к системе, становится неактуальной. Я оставлю это на @gbjbaanb, так как против меня он сосредоточился на этой части и уже есть пример. – gimpf

 Смежные вопросы

  • Нет связанных вопросов^_^