Svn добавить несколько файлов

Обновлено: 03.07.2024

Я ищу хороший способ автоматически "svn добавить" все неверсионные файлы в рабочей копии в мой репозиторий SVN.

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

мой сервер работает Windows Server 2003 таким образом, решение Unix не будет работать.

svn add --force * --auto-props --parents --depth infinity -q

отличный совет! Одно замечание: мой затмение автоматически добавляет новые файлы в список игнорирования. Это может быть вопрос конфигурации, но в любом случае: есть --no-ignore опция, которая помогает.

после этого, вы можете совершить:

Это вопрос к шахте но там есть ответ, который относится к этому вопросу:

что работает это:

добавляет содержимое подкаталогов.

не добавляет игнорируемые файлы.

список добавленных файлов.

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

это сработало для меня:

поскольку вы уже решили свою проблему для Windows, это решение UNIX (после Sam). Я добавил здесь, поскольку я думаю, что это все еще полезно для тех, кто достигает этого вопроса, задавая то же самое (поскольку название не включает ключевое слово "WINDOWS").

Примечание (февраль, 2015): Как прокомментировал "bdrx", вышеуказанная команда может быть еще более упрощена в этом путь:

этот метод должен обрабатывать имена файлов, в которых есть любое число/комбинация пробелов.

вот объяснение того, что делает эта команда:

  • Список всех измененных файлов.
  • ограничить этот список строками с '?- в начале, то есть новые файлы.
  • удалить?'символ в начале строки.
  • удалить пробелы в начале строки.
  • передайте имена файлов в xargs чтобы запустить svn, добавьте несколько раз.

используйте аргумент-i для xargs для обработки возможности импорта имен файлов с пробелами в' svn add '- в основном, -I устанавливает <> для использования в качестве заполнителя, чтобы мы могли поместить "символы вокруг имени файла, используемого'svn add'.

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

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

это добавит любой неверсионный файл в текущий каталог и все версионные дочерние каталоги.

Это, как описано в svn book и самый простой и работает идеально для меня

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

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

вот моя настройка крючка и пакетный файл, который делает это

Черепаха Крюк Скрипт:

Я всегда использую:

копировать и вставить

В этой реализации вы получите проблемы в случае, если ваши папки / имена файлов имеют более одного пространства, как показано ниже:

такие случаи покрываются простым:

Если вы используете Linux или Cygwin или MinGW в windows, вы можете использовать bash-подобные решения, как показано ниже. В отличие от других подобных, представленных здесь, этот учитывает пространства имен файлов:

потратив некоторое время на то, чтобы выяснить, как рекурсивно добавлять только некоторые файлы, я подумал, что было бы правильно поделиться тем, что сработало для меня:

вот некоторые объяснения.

первая команда добавляет все каталоги. Вторая команда добавляет только файлы в соответствии с указанными шаблонами.

позвольте мне дать более подробную информацию:

  • FOR: вы знаете, управление циклом.
  • / F: середины принимают файлы и каталоги (не уверен точно).
  • %F: его переменная; он будет принимать значение каждого из перечисленных файлов одновременно; он может иметь другое односимвольное имя.
  • IN: нет необходимости объяснять, верно?
  • ('dir /s /b /a:d'): команда DOS, которая будет перечислять каталоги; в моем случае /s рекурсивна, /b должен принимать только полный путь, /a:d означает только каталог; измените его, как вы хотите, сохраняя скобки и апострофы.
  • DO: означает, что следующее в команде-это то, что будет выполнено для каждого каталога
  • svn add --depth=empty: это необходимый SVN commando для запуска; определение глубины означает добавление только каталога, а не файлов внутри них.
  • "%F": Так вы используете переменную, определенную ранее.

во второй команде единственными различиями являются команда dir и команда svn, я думаю, что это достаточно ясно.

вы можете использовать команду

если ваши файлы / каталоги не добавляются рекурсивно. Тогда проверь это.

рекурсивное добавление является свойством по умолчанию. Вы можете видеть в SVN книга.

проблема может быть в вашем списке игнорирования или глобальных свойствах.

Проверьте глобальные свойства для игнорирования звезда (*)

  • щелкните правой кнопкой мыши в вашем РЕПО в окно. Выберите TortoiseSVN > Properties .
  • смотрите, если у вас нет собственности svn:global-ignores with a value of *
  • если у вас есть собственность с star(*) тогда он будет игнорировать рекурсивное добавление. Поэтому удалите это свойство.

Проверьте глобальный шаблон игнорирования для игнорирования звезды ( * )

  • щелкните правой кнопкой мыши в вашем РЕПО в окно. Выберите TortoiseSVN > Settings > General .
  • см. в глобальном шаблоне игнорирования, если вы не установили звездочка(*) там.
  • если вы нашли star(*) , снять данный объект.

этот парень также пояснил, почему это свойство добавлено в мой проект.

наиболее похожий способ, которым он туда попал, заключается в том, что кто-то щелкнул правой кнопкой мыши файл без расширения и выбрал TortoiseSVN -> SVN Ignore -> * (рекурсивно), а затем совершил это.

вы можете проверить журнал, чтобы увидеть, кто совершил это свойство изменить, находить из того, что они на самом деле пытались сделать, и попросить их быть больше осторожнее в будущем. :)

Иногда бывает полезно создать рабочую копию, состоящую из нескольких частей, извлечённых из различных источников. Например, бывает необходимо собрать различные файлы или папки из разных мест хранилища, или, возможно, вообще из различных хранилищ. Если вы желаете, чтобы у всех пользователей была одинаковая компоновка, вы можете определить свойства svn:externals , чтобы разместить указанные ресурсы в тех местах, где они нужны.

Внешние папки

Скажем вы извлекаете рабочую копию проекта /project1 в D:\dev\project1 . Выберите папку D:\dev\project1 , сделайте правый клик и выберите меню Windows → Свойства из контекстного меню. Появляется диалог Свойства. Перейдите на вкладку Subversion. Там вы можете установить свойства. Нажмите Свойства. . В диалоге свойств, либо кликните дважды на svn:externals если есть, либо нажмите на кнопку Создать. и выберите внешнее из меню. Для добавления новой внешней ссылки нажмите на кнопке Создать. и заполните требуемую информацию в появившемся диалоге.

Внимание

Адреса URL должны быть правильно экранированы иначе они не будут работать, т. е. вы должны заменить каждый пробел на %20 .

Если вы желаете, чтобы локальные пути включали пробелы или другие специальные символы, вы можете заключить их в двойные кавычки, или использовать перед специальным символом символ \ (обратную косую черту) для экранирования в стиле оболочки Unix. Конечно же, это также означает, что вы должны использовать / (прямую косую черту) в качестве разделителя пути. Обратите внимание: такое поведение появилось в Subversion 1.6 и это не будет работать с более старыми клиентами.

Используйте явные номера ревизий

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

Диалог редактирования свойств svn:externals позволяет вам выбрать внешние определения и автоматически установить их явно на ревизию HEAD.

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

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

Если вы используете абсолютные URL в определениях svn:externals , и вам надо перебазировать вашу рабочую копию (т.е. URL вашего хранилища изменяется), то внешние включения не изменятся и возможно, больше работать не будут.

Такие URL всегда начинаются со строки ../ , например:

Обратите внимание: URL указывается относительно URL папки со свойством svn:externals , а не папки, в которой внешнее записывается на диск.

Относительно корня хранилища

Такие URL всегда начинаются со строки ^/ , например:

Вы можете легко делать ссылки на другие хранилища с таким же SVNParentPath (общая папка, содержащая несколько хранилищ). Например:

Относительно имени сервера

URL, начинающиеся со строки / копируют часть URL, содержащую схему и имя сервера, например:

Если необходимо вы также можете указать опорную (peg) и оперативную ревизию для адреса URL. Чтобы больше узнать об опорных (peg) и оперативных ревизиях прочитайте, пожалуйста, соответствующую главу в книге о Subversion.

Важно

Если вы укажете папку назначения для внешних включений как подпапку, как в приведённых выше примерах, убедитесь, что все папки межу ними также версионируемые. Так для вышеприведённых примеров папка common должна быть версионируемой!

Несмотря на то, что внешние включения будут работать правильно в большинстве случаев, если папки между ними неверсируемые, всё же есть несколько операций, которые не будут работать как вы ожидаете. И статус оверлейных значков также не будет отображаться корректно.

Если вам необходимо больше информации о том, как TortoiseSVN обходится со свойствами, прочтите раздел «Установки проекта».

Для того, чтобы узнать о различных методах доступа к общим подпроектам, прочтите «Включить общий подпроект».

Внешние файлы

Начиная с Subversion 1.6, вы можете добавлять отдельные внешние файловые включения в вашу рабочую копию, используя тот же синтаксис, что и для папок. Однако, есть некоторые ограничения.

Путь к внешнему файлу должен быть прямым потомком папки, которая задана в свойстве svn:externals .

URL внешнего файлового включения должен вести в то же хранилище, в которое внешнее файловое включение будет вставлено; между-хранилищные внешние файловые включения не поддерживаются.

Внешнее файловое включение ведёт себя во многом как любой другой версированный файл, но оно не может быть перемещено или удалено при помощи обычных команд; вместо этого должно быть изменено свойство svn:externals .

Создание внешних включений с помощью перетаскивания (drag-and-drop)

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

Просто перетяните правой кнопкой мыши файл или папку из одной рабочей копии туда, куда вы хотите их добавить как внешнее включение. При отпускании кнопки мыши появится контекстное меню: SVN Добавить сюда как внешнее . Если вы кликнете на этом пункте меню, то автоматически будет добавлено свойство svn:externals . Всё что вам нужно сделать после этого — зафиксировать изменения свойства и обновить, чтобы эти внешние включения правильно добавились в рабочую копию.

I am using an ORM which generates large amounts of files from a CLI. Is there an easy way to run the svn add on all files within a directory which appear as ? when I run svn status ?

Edit These files exist in a directory tree so adding * for one directory will not work.

5,194 3 3 gold badges 33 33 silver badges 46 46 bronze badges 761 1 1 gold badge 5 5 silver badges 5 5 bronze badges If you are on Windows you can always use TortoiseSVN to make life easier.

15 Answers 15

This will add all unknown (except ignored) files under the specified directory tree:

This will add all unknown (except ignored) files in the current directory and below:


113k 24 24 gold badges 204 204 silver badges 220 220 bronze badges I still get ignored folders files added when using the second command.

For reference, these are very similar questions.

These seem to work the best for me. They also work with spaces, and don't re-add ignored files. I didn't see them listed on any of the other answers I saw.

Edit: It's important to NOT use "add *" if you want to keep your ignored files, otherwise everything that was ignored will be re-added.

5,155 5 5 gold badges 37 37 silver badges 46 46 bronze badges this will work well all until you encounter a filename with space? (similar problem with many of the proposed solutions based on svn stat) On MacOS X, this seems to break for paths with spaces in them. Sadly the xargs that comes with MacOS does not seem to accept the -d flag.

you can just do an svn add path/to/dir/* you'll get warning about anything already in version control but it will add everything that isn't.

58.7k 89 89 gold badges 281 281 silver badges 487 487 bronze badges 58.7k 9 9 gold badges 94 94 silver badges 111 111 bronze badges

Taken from somewhere on the web but I've been using it for a while and it works well.

3,301 5 5 gold badges 22 22 silver badges 25 25 bronze badges

If svn add whatever/directory/* doesn't work, you can do it the tough way:

206k 29 29 gold badges 400 400 silver badges 458 458 bronze badges

You should be able to run:

It may complain about the files that are already under version control, but it will also add the new ones.

You may want to think about whether or not you really want to add these generated files to version control, though. They could be considered derived artifacts, sort of like the compiled code, and thus shouldn't be added. Of course, this is up to you, but its something to think about.

33.8k 30 30 gold badges 97 97 silver badges 136 136 bronze badges

does not work with whitespaces. Instead one can use

(seems like the number of leading blanks is different on my system -- just adjust it).

I'm looking for a good way to automatically 'svn add' all unversioned files in a working copy to my SVN repository.

I have a live server that can create a few files that should be under source control. I would like to have a short script that I can run to automatically add these, instead of going through and adding them one at a time.

My server is running Windows Server 2003 so a Unix solution won't work.


29.1k 21 21 gold badges 97 97 silver badges 124 124 bronze badges 5,655 4 4 gold badges 32 32 silver badges 36 36 bronze badges Cygwin is an option. Gives you the power of bash on any windows environment. Been a user for over 10 years with very minor problems.

19 Answers 19

svn add --force * --auto-props --parents --depth infinity -q

Great tip! One remark: my Eclipse adds new files to the ignore list automatically. It may be a matter of configuration, but anyhow: there is the --no-ignore option that helps.

After this, you can commit:


29.1k 21 21 gold badges 97 97 silver badges 124 124 bronze badges 4,271 3 3 gold badges 18 18 silver badges 14 14 bronze badges Great tip. Much better than using svn status. "svn add --force" seems to be sufficient. Is there an easy way to set this to a shortened macro (i.e., as you can with git)? Also, would it be possible to update this answer so that it explains each bit? @MrDuk : Shortened : alias magic="svn add --force * --auto-props --parents --depth infinity -q" - Explained : svn help add Issue is this adds ignored files correct? Not desireable.

This is a different question to mine but there is an answer there that belongs on this question:

123k 76 76 gold badges 316 316 silver badges 500 500 bronze badges also you could probably dig up sed and grep on windows if you really wanted.

What works is this:

Adds the contents of subdirectories.

Does not add ignored files.

Lists what files were added.

The dot in the command indicates the current directory, this can replaced by a specific directory name or path if you want to add a different directory than the current one.


6,548 4 4 gold badges 42 42 silver badges 65 65 bronze badges Actually that should be .\* or if svn root is on a different dir stuff\svn_root\* . @Nux Only now after all these years do I finally see what you were getting at :) In the command the dot is the path that specifies the current directory. Naturally any valid alternative can be supplied instead.

This worked for me:

As you already solved your problem for Windows, this is a UNIX solution (following Sam). I added here as I think it is still useful for those who reach this question asking for the same thing (as the title does not include the keyword "WINDOWS").

Note (Feb, 2015): As commented by "bdrx", the above command could be further simplified in this way:


23.1k 9 9 gold badges 91 91 silver badges 100 100 bronze badges Nice, compact, concise, also lends itself to extension quite well. Thanks.

This will add any unversioned file in the current directory and all versioned child directories.

This method should handle filenames which have any number/combination of spaces in them.

Here is an explanation of what that command does:

  • List all changed files.
  • Limit this list to lines with '?' at the beginning - i.e. new files.
  • Remove the '?' character at the beginning of the line.
  • Remove the spaces at the beginning of the line.
  • Pipe the filenames into xargs to run the svn add multiple times.

Use the -i argument to xargs to handle being able to import files names with spaces into 'svn add' - basically, -i sets <> to be used as a placeholder so we can put the " characters around the filename used by 'svn add'.

An advantage of this method is that this should handle filenames with spaces in them.

TortoiseSVN has this capability built in, if you're willing to use a non-command-line solution. Just right click on the top level folder and select Add.


29.1k 21 21 gold badges 97 97 silver badges 124 124 bronze badges 21.2k 14 14 gold badges 51 51 silver badges 57 57 bronze badges With huge repository TortoiseSVN hangs. This made me look for command line alternatives :-)

This is as documented on svn book and the simplest and works perfect for me


9,469 6 6 gold badges 58 58 silver badges 67 67 bronze badges


29.1k 21 21 gold badges 97 97 silver badges 124 124 bronze badges 12.6k 15 15 gold badges 72 72 silver badges 100 100 bronze badges

Copy&paste


29.1k 21 21 gold badges 97 97 silver badges 124 124 bronze badges


2,094 2 2 gold badges 23 23 silver badges 40 40 bronze badges Op explicity states that a Unix solution is no use to him.

I wanted to add any files or folders which are not added in my repository when I begin the commit process.

The problem with many of the answers is they will list unversioned files which should be ignored as per my ignore list in TortoiseSVN.

Here is my hook setting and batch file which does that

Tortoise Hook Script:

svnadd.bat


22.8k 24 24 gold badges 102 102 silver badges 172 172 bronze badges

Within this implementation, you will get in trouble in the case your folders/filenames have more than one space like below:

such cases are covered by simple:


29.1k 21 21 gold badges 97 97 silver badges 124 124 bronze badges

If you use Linux or use Cygwin or MinGW in windows you can use bash-like solutions like the following. Contrasting with other similar ones presented here, this one takes into account file name spaces:


After spending some time trying to figure out how to recursively add only some of the files, i thought it would be valid to share what did work for me:

Here goes some explanation.

The first command adds all the directories. The second command adds only the files accordingly to the specifed patterns.

Let me give more details:

  • FOR: you know, the loop control.
  • /F: means take the files and directories (not sure exactly).
  • %F: its a variable; it will assume the value of each of the listed files at a time; it could have another one-character-name.
  • IN: no need to explain, right?
  • ('dir /s /b /a:d'): the DOS command that will list the directories; in my case /s is recursive, /b is to take only the full path, /a:d means only the directory; change it as you wish keeping the parenthesis and apostrophes.
  • DO: means that what comes next in the command is what will be executed for each directory
  • svn add --depth=empty: it is the desired SVN commando to be run; the depth definition means to add only the directory and not the files inside them.
  • "%F": that's how you use the variable defined earlier.

In the second command, the only differences are the dir command and the svn command, i think it is clear enough.

Читайте также: