Шукайте у сховищі SVN ім’я файлу


84

У нас є масове сховище для коду, що містить тисячі папок і підпапок, я хочу шукати під цим репозиторієм з іменем файлу або з якимсь словом.

Root folder
    a\
    b\
    c\
    d\
    e\
    f\ab\
    f\ab\cd.txt

Я хочу шукати cd.txt, але не знаю, де він знаходиться в репозиторії SVN, для цього я хочу виконати пошук у кореневій папці SVN, де я поміщу ім'я файлу cd.txt і запускаю команду, перевірятиму у кожній папці і відображатиметься детальне повідомлення про файл ...

Вимога надії зрозуміла. Чи можете ви допомогти мені у цьому?


Я сподівався, що ви можете ввести команду на стороні клієнта, яка буде виконувати пошук на стороні сервера. Це репозиторій SVN, з яким я працюю, має жахливий час відгуку та швидкість передачі даних через VPN. На жаль, це не здається можливим.
Патрік М

Відповіді:


60

Якщо файл знаходиться у вашій робочій копії, то якщо ви використовуєте svn 1.5:

svn list --depth infinity | grep <filename>

або попередня версія svn:

find . -name <filename> -not -path '*.svn*'

Якщо вам потрібно знайти файл в історії (видалений або переміщений):

svn log -v | less

і шукайте його за допомогою:

\<filename><return>

3
svn list --depth infinity працює добре, у вікнах, звичайно, у вас не буде grep за замовчуванням, я просто скинув його у текстовий файл і провів пошук за допомогою текстового редактора:
Mandrake

5
У Windows PowerShell ви можете використовувати його ... | select-string <filename>як заміну grep.
MarnixKlooster ReinstateMonica

2
У звичайному Windows командний рядок ... | find "<filename>"також буде працювати як заміна grep. ПРИМІТКА : "" обов’язкові навколо імені файлу.
Raystorm

7
Якщо файл знаходиться в моїй робочій копії, мені не потрібен svn, щоб знайти його. Додайте, як шукати репо, як відповіді Антона та Маріоса. Можливо, це для вас очевидно, але саме їх відповіді підготували увагу для простого старого мене.
Lieven Keersmaekers

1
Ви можете svn co --depth empty REPOURL RepoDir, cd RepoDirа svn list --depth infinityпотім отримувати всі шляхи до файлів із сервера SVN (можливо, створюючи мільйони рядків, якщо у вас мільйони).
Іван Акчеуров

58

Наступні роботи для мене (svn версія 1.4.6)

svn list -R <URL> | grep "<file_pattern>"

6
Чудово. Це працює для Черепахи. У windows: svn list -R myurl >> results.txt
live-love

Працює дуже добре. Також набагато легше запам'ятати просто "-R", ніж "- глибина нескінченності".
MPV

повільний для великих репозиторіїв, тоді краще використовувати svn-crawler нижче.
karsten

17

З доступом до самого репозитарію (тобто на системі вашого хост-файлу svn)

svnlook tree [path_to_repo] | grep [file_name]  

або для пошуку всіх репозиторіїв (якщо у вас багато налаштувань репо).

for i in \`ls [path_to_repos_dir]`; do echo $i; svnlook tree [path_to_repos_dir]/$i | grep -i [file_or_folder_name]; done 

параметр --full-paths дасть повний шлях у репо до файлу (якщо він знайдений)

приклад:

for i in `ls /u01/svn-1.6.17/repos`; do echo $i; svnlook tree --full-paths /u01/svn- 1.6.17/repos/$i | grep -i somefile.txt; done

перенаправити вихід у файл, якщо потрібна статична копія.
передбачає використання ОС nix.


3
+1 за використання "svnlook tree --full-paths <path_to_repo> | grep <filename>". Це найшвидший спосіб, який я знайшов, виконуючи пошук файлів у диверсійному репо.
Nick Grealy

блискавично швидкий пошук, дуже корисний.
Дастін Кук

12

svn list --depth infinity <your-repo-here>отримати список файлів у репозиторії, а потім svn catотримати вміст. Ви можете додати --xmlключ до listкоманди, щоб спростити синтаксичний розбір.


Не забудьте використовувати, grepякщо ви хочете побачити 1 файл, особливо якщо у вас є тисячі файлів у сховищі, як OP. Крім того, існує --incrementalрежим, якщо вам потрібно приєднати висновок до пізнішого / більш раннього виводу XML.
триз

6

Нещодавно я опублікував свою утиліту для переліку сховища, що набагато швидше, ніж підхід "svn ls --depth infinity". Here're в контрольних . Він просто викликає функцію, яка доступна у внутрішньому API Subversion, але тепер доступна через командний рядок.

Тож можна бігати

$ svn-crawler <URL> | grep "<file_pattern>"

Хороший інструмент. Я тестував з CentOS7. Мені довелося додати libsvn_delta та libsvn_subr до списку target_link_libraries у CMakeLists.txt, а також адаптувати LIBAPR_LIBRARY_INCLUDE з "include / apr-1.0" на "include / apr-1".
karsten

4

Якщо ви використовуєте TortoiseSVN, ви можете спробувати це, ЯКЩО ви хочете переглядати проект за проектом - працює для мене:

  1. Створіть порожній проект під URL-адресою верхнього рівня вашого сховища, назвіть його BLANK
  2. Клацніть на URL-адресу Repo на лівій панелі
  3. На правій панелі виберіть свій ЧИСТИЙ проект та бажаний проект - скажімо, транк
  4. Клацніть правою кнопкою миші, щоб відкрити меню браузера та виберіть "Порівняти URL-адреси", залежно від розміру вашого репо, завантаження може зайняти хвилину. Але ви в основному отримуєте весь свій список проектів у списку "готових до пошуку".
  5. Введіть ім’я файлу або інший рядок у фільтр пошуку


-2

Якщо віддалений репозиторій не є величезним, то простим методом є: Ви можете здійснити "замовлення", щоб отримати локальне сховище. Якщо ви перебуваєте в машині Windows, ви використовуєте команду "Пошук", або машина Linux використовує команду "Знайти".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.