Оформить заказ одним файлом из Subversion

320

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

Как мне обойти эту проблему при использовании Subversion?

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

BlueGene
источник
Вы можете сделать это по-другому. Войдите на рабочий сервер и svn upв локальный каталог на своем компьютере.
Neocortex

Ответы:

403

Простой ответ заключается в том, что вы svn exportфайл вместо того, чтобы проверить его.

Но это может быть не то, что вы хотите. Возможно, вы захотите поработать с файлом и проверить его снова, без необходимости загружать ненужную ГБ.

Если у вас Subversion 1.5+, тогда сделайте небольшую проверку:

svn checkout <url_of_big_dir> <target> --depth empty
cd <target>
svn up <file_you_want>

Для более старой версии SVN вы можете воспользоваться следующими преимуществами:

  • Оформите каталог, используя ревизию в далеком прошлом, когда он был менее полон мусора, который вам не нужен.
  • Обновите нужный файл, чтобы создать смешанную ревизию. Это работает, даже если файл не существует в проверенной вами ревизии.
  • Прибыль!

Альтернатива (например, если в каталоге слишком много мусора прямо из ревизии, в которой он был создан) - сделать копию URL-> URL-адреса нужного вам файла в новом месте в хранилище (фактически это рабочая ветвь). файла). Проверьте этот каталог и сделайте ваши изменения.

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

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

Стив Джессоп
источник
13
Действительно простое решение - получить доступ к хранилищу через веб-браузер.
Дольмен
11
@dolmen - при условии, что нет необходимости изменять файл, возможно (и при условии, что веб-интерфейс работает для этого хранилища). Я использую командную строку SVN, поэтому для меня это проще, svn exportчем веб-интерфейс, если я знаю, какой файл мне нужен. Спрашивающий уже использует SVN, поэтому я думаю, что это зависит от того, какой клиент и насколько легко использовать этот клиент svn export. Я считаю, что веб-интерфейс лучше для просмотра, чем svn ls:-)
Стив Джессоп
2
SmartSVN Client заблокирует отдельные файлы, если ваш Subversion Server поддерживает это. И есть ловушки, которые требуют проверки, прежде чем двоичный / исполняемый файл может быть проверен. Не имеет смысла, когда два человека изменяют двоичный штраф и объединяют эти изменения вместе. Это могут быть новые функции, которые не были доступны, когда задавался этот вопрос.
TamusJRoyce
@Tamus: «Это на самом деле не имеет смысла» согласился, но в случаях, которые я описываю, слияние заключается просто в том, чтобы вернуть новую версию в исходное местоположение. Не ожидается, что двоичный файл был изменен в цели слияния. Таким образом, сам файл не нуждается в каком-либо «слиянии», кроме замены старой версии новой, это просто то, как SVN называет его, и записывает, откуда произошли изменения, для дальнейшего использования. Вы правы, можно избежать конфликтов, блокируя файл на время.
Стив Джессоп
1
TortoiseSVN может проверить отдельные файлы. Я считаю, что это делает то же самое за кулисами, чтобы достичь этого.
Майк Старов
109

Попробуй svn exportвместо svn checkout. Это работает для отдельных файлов.

Причина ограничения заключается в том, что checkoutсоздается рабочая копия, которая содержит метаинформацию о хранилище, ревизии, атрибутах и ​​т. Д. Эти метаданные хранятся в подкаталогах с именем «.svn». И отдельные файлы не имеют подкаталогов.

Mnementh
источник
2
Предостережение: крайне старые версии svnне будут выполнять экспорт в один файл.
Младен Ябланович
5
Это превосходный метод, если вы просто хотите получить последнюю версию определенного скрипта как часть развертывания или чего-то еще.
william.berg
2
Эта оговорка была натянутой даже в 2011 году, но очень старые версии могут это сделать svn cat $url_to_file_in_repo > $local_file_name.
cprn
53

Используйте svn catили svn export.

Для этого вам не нужно извлекать рабочий каталог, но вы не сможете зафиксировать любые сделанные вами изменения. Если вам нужно внести изменения и зафиксировать их, вам нужен рабочий каталог, но вам не нужно извлекать его полностью. Извлеките ревизию, в которой каталог был еще / почти пуст, а затем используйте 'svn cat', чтобы извлечь файл из HEAD.

Милан Бабушков
источник
svn cat svn://.../my_file.txtбыло именно то, что я искал. Я работаю в svn://единственном (нет http://) репозитории, и, похоже, новейшие интерфейсы websvn не обеспечивают загрузку необработанного файла (или у нас он неправильно настроен, или я слепой). Проще сделать это, чем checkout+ upпросто для загрузки файла.
Рибамар
12

Если вы хотите просмотреть readme.txt в своем хранилище, не проверяя его:

$ svn cat http://svn.red-bean.com/repos/test/readme.txt
Это файл README. Вы должны прочитать это.

Совет: Если ваша рабочая копия устарела (или у вас есть локальные изменения), и вы хотите увидеть версию HEAD файла в вашей рабочей копии, svn cat автоматически получит версию HEAD, когда вы дадите ей путь:

$ cat foo.c
Этот файл находится в моей локальной рабочей копии и содержит изменения, которые я сделал.

$ svn cat foo.c
Последняя версия, свежая из репозитория!

Источник

GEOCHET
источник
Вы также можете напрямую использовать любой HTTP-клиент. Ваш веб-браузер или инструмент командной строки, такой как curlили wget.
Дольмен
9

Ниже приводится эквивалентное решение TortoiseSVN для принятого ответа (я написал это во внутреннем документе для моей компании, когда мы вновь внедряем SVN). Я думал, что было бы полезно поделиться здесь также:

Извлечение одного файла: Subversion не поддерживает извлечение одного файла, а только извлечение структур каталогов. (Ссылка: http://subversion.tigris.org/faq.html#single-file-checkout ). Это связано с тем, что для каждого каталога, который извлекается как рабочая копия, метаданные, касающиеся изменений / версий файлов, хранятся в виде внутренней скрытой папки (.svn / _svn). Это не поддерживается в настоящее время (v1.6) для отдельных файлов.

Альтернативная рекомендуемая стратегия: вам нужно будет выполнить часть каталога извлечения только один раз, после чего вы можете напрямую перейти и оформить отдельные файлы. Сделайте разреженную проверку родительской папки и структуры каталогов. Разреженная проверка в основном проверяет только структуру папок, не заполняя файлы содержимого. Таким образом, вы извлекаете только структуры каталогов и не должны извлекать ВСЕ файлы, как это было важно. Ссылка: http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-checkout.html

Шаг 1. Перейдите в браузер хранилища.

Шаг 2 : Щелкните правой кнопкой мыши родительскую папку в репозитории, содержащую все файлы, с которыми вы хотите работать, и выберите «Оформить заказ».

Шаг 3 : В новом всплывающем окне убедитесь, что каталог проверки указывает на правильное местоположение на вашем локальном ПК. Также будет раскрывающееся меню с надписью «глубина проверки». Выберите «Только этот элемент» или «Непосредственные дети, включая папки», в зависимости от ваших требований. Второй вариант рекомендуется, так как, если вы хотите работать с вложенной папкой, вы можете напрямую перейти в следующий раз, в противном случае вам придется повторить всю эту процедуру еще раз для вложенной папки.

Шаг 4 : родительская папка (и) теперь должна быть доступна в выбранной вами папке и теперь отслеживается с помощью SVN (теперь должна присутствовать скрытая папка «.svn» или «_svn»). Теперь в репозитории щелкните правой кнопкой мыши по одному файлу, который вы хотите получить отдельно, и выберите опцию «Обновить элемент до ревизии». Один файл теперь может быть обработан и возвращен в хранилище.

Надеюсь, это поможет.

Каушик Гопал
источник
8

Вы можете сделать это в два этапа:

  1. Извлечь пустой SVN-репозиторий только с метаинформацией:

    $ cd /tmp
    
    $ svn co --depth empty http://svn.your.company.ca/training/trunk/sql
    
  2. Запустите, svn upчтобы обновить указанный файл:

    $ svn up http://svn.your.company.ca/training/trunk/sql/showSID.sql
    
user2920375
источник
6

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

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

Это очень просто, извлеките папку, в которую вы хотите включить файл, и просто добавьте свойство в папку

svn propedit svn:externals .

с таким содержанием:

file.txt /repos/path/to/file.txt

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

blanne
источник
4

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

Дейв Андерсон
источник
4
cd C:\path\dir
svn checkout https://server/path/to/trunk/dir/dir/parent_dir--depth empty
cd C:\path\dir\parent_dir
svn update filename.log

(Изменить имя файла.log)

svn commit -m "this is a comment."
Анон
источник
4

Ответ Стива Джессопа не сработал для меня. Я читаю файлы справки для SVN, и если у вас просто есть изображение, вы, вероятно, не захотите проверять его снова, если вы не используете Photoshop, поэтому экспортируйте - это лучшая команда, чем извлечение, поскольку она не версионная (но это незначительно).

И --depth ARG должен быть не пустым, а файлами, чтобы получить файлы в ближайшем каталоге. Таким образом, вы получите все поля, не только одно, но пустое ничего не возвращает из хранилища.

 svn co --depth files <source> <local dest>

или

svn export --depth files <source> <local dest>

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

Васса
источник
1
Дело в --depth emptyтом, что другие файлы не должны быть извлечены, и вы можете получить только один файл с svn up <source/file>. При svn exportэтом нет необходимости делать это, просто укажите файл.
Кевин Вермеер
@reemrevnivek - вы правы. Ну, вопрос только для одного файла, это работает без извлечения всего файла структуры каталогов, даже если он пустой.
Васс
4

Я бы просто просмотрел его и экспортировал один файл. Если у вас есть доступ HTTP, просто используйте веб-браузер, чтобы найти файл и взять его.

Если вам нужно вернуть его после редактирования, это может быть немного более утомительным, но я уверен, что может быть svn importфункция ...

Oli
источник
3

Сделайте что-то вроде этого:

mkdir <your directory>/repos/test

svn cat http://svn.red-bean.com/repos/test/readme.txt > <your directory>/repos/test/readme.txt

По сути, идея заключается в создании каталога, в который вы хотите получить файл из SVN. Используйте svn catкоманду и перенаправьте вывод в файл с тем же именем. По умолчанию кошка будет сбрасывать информацию на stdio.

Маниш Сингх
источник
2

Если вы просто хотите файл без информации о ревизии, используйте

svn export <URL>
Тед
источник
2

С Subversion 1.5 становится возможным извлекать (все) файлы каталога без проверки каких-либо подкаталогов (различные флаги --depth). Не совсем то, что вы просили, но форма «меньше всего».

jackr
источник
2

Используя метод разреженного извлечения, вы МОЖЕТЕ проверить конкретный файл, который уже извлечен или существует ... с помощью простого трюка:

После проверки верхнего уровня вашего репозитория с помощью опции «только этот элемент» в проводнике Windows вы ДОЛЖНЫ сначала щелкнуть правой кнопкой мыши файл, который необходимо обновить; выберите Repo Browser в контекстном меню; найдите этот файл СНОВА в браузере хранилища и щелкните правой кнопкой мыши. Теперь вы должны увидеть «обновить элемент до ревизии» в контекстном меню.

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

devXen
источник
2

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

Получим файл по следующему URL: http: //subversion.repository.server/repository/module/directory/myfile

svn co  http://subversion.repository.server/repository/module/directory/myfile /**directoryb**

Поэтому я проверил заданный каталог, содержащий целевой файл, который я хотел получить в фиктивном каталоге (скажем, etcb для URL, заканчивающегося на /etc).

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

Теперь вам нужно просто скопировать «.svn» в каталог, который будет новой «рабочей копией». Тогда вам просто нужно:

cp .svn /directory
cd /directory
svn update myfile

Теперь каталог находится под контролем версий. Не забудьте удалить каталог directoryb, который был просто «временной рабочей копией».

hendergassler
источник
Разве это не то, что делает редкая проверка? Вы действительно не должны взламывать файлы в каталоге .svn вручную.
Лассе В. Карлсен
Возможно, но это решило проблему должным образом. Я полагаю, что именно так должно работать управление версиями, а также возможность обрабатывать файлы как расширение каталогов. Попробуйте и скажите мне, что не так с логикой. Я бы предложил команде разработчиков Subversion расширить утилиту svn этой функцией, это решило бы проблемы всех, кто ответил на эту тему.
hendergassler
2

Поскольку ни один из других ответов не работал для меня, я сделал это, используя этот хак:

$ cd /yourfolder
svn co https://path-to-folder-which-has-your-files/ --depth files

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

Лачо Томов
источник
ОП попросил svn coодин файл, чтобы избежать полного каталога, полного файлов изображений. Кроме того, добавление символической ссылки может только увеличить сложность, переход из временного каталога может сработать, но вам все равно придется проверить весь каталог изображений только для одного изображения. У @ steve-jessop была правильная идея
Крис Маротта
2
@ChrisMarotta ОП задала вопрос 9 лет назад. Никто здесь не отвечает на ФП. Это общая тема для такого рода проблем, и она больше не имеет ничего общего с оригинальным ОП. Люди приходят сюда, чтобы найти решение своей проблемы. И когда они прочитают это, некоторые из них окажутся в моей ситуации, когда это было единственно правильное решение. Вот почему я написал это.
Лачо Томов
1
Я рад этому ответу, он мне помог
Леос Литерак
1

Эта проблема покрыта:

http://subversion.tigris.org/issues/show_bug.cgi?id=823

Прилагается скрипт, который позволяет вам извлекать один файл из SVN, вносить изменения и фиксировать изменения обратно в хранилище, но вы не можете запустить «SVN» для извлечения остальной части каталога. Он был протестирован с SVN-1.3, 1.4 и 1.6.

ddkilzer
источник
1

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

Используя TortoiseSVN Repository Browser , выберите файл, щелкните правой кнопкой мыши, а затем выберите « Копировать URL в буфер обмена ». Вставьте этот URL в ваш браузер, и после входа в систему вам будет предложено загрузить файл.

Таким образом, вы также можете выбрать нужную версию и загрузить старую версию файла.

Обратите внимание, что это действительно, если ваш сервер SVN имеет веб-интерфейс.

Даниил
источник