Как я могу найти корневую папку данной рабочей копии subversion

#python #svn

#svn #репозиторий

Вопрос:

Довольно часто я сижу в середине рабочей копии subversion, и я хочу сделать быстрый svn status , чтобы узнать, какие изменения я внес с момента последней проверки. Однако svn status работает только с текущей папкой и ее дочерними элементами. (Аналогично для svn up тоже)

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

Ответ №1:

Вот мой первый ответ: я написал небольшой скрипт bash под названием svnbase :

 #!/bin/bash -u

# this command outputs the top-most parent of the current folder that is still 
# under svn revision control to standard out

# if the current folder is not under svn revision control, nothing is output
# and a non-zero exit value is given

parent=""
grandparent="."

while [ -d "$grandparent/.svn" ]; do
    parent=$grandparent
    grandparent="$parent/.."
done

if [ ! -z "$parent" ]; then
    echo $parent
else
    exit 1
fi
  

Итак, теперь я могу сделать это:

 [~/work/scripts/XXX/code/speech-detection/framework]$ cd $(svnbase)
[~/work/scripts/XXX]$ svn status
?      code/speech-detection/framework/output.old
[~/work/scripts/XXX]$ cd -
/home/XXXX/work/scripts/XXX/code/speech-detection/framework
[~/work/scripts/XXX/code/speech-detection/framework]$ 
  

Комментарии:

1. Следующим логическим шагом было бы интегрировать эту серию команд, которые вы вводите, в сам скрипт.

2. Если вы предпочитаете абсолютный путь, а не относительный, инициализируйте: grandparent=$(pwd) и каждый цикл: grandparent=$(dirname parent)

3. Это будет работать только для версий Subversion до 1.6. Версии 1.7 и более поздние имеют только одну .svn папку в корневой папке.

4. @ccpizza Тогда, я думаю, вы могли бы просто зацикливаться, пока не найдете .svn папку…

Ответ №2:

В Windows:

 svn info . |findstr /C:"Working Copy Root Path:"
  

В Linux:

 svn info . |grep -F "Working Copy Root Path:"
  

Она может быть присвоена переменной с помощью небольшой манипуляции со строкой. Версия для Windows:

 FOR /F "delims=" %%i IN ('svn info . ^|findstr /C:"Working Copy Root Path:"') DO SET SOME_TEMP_VAR=%%i
SET WORKING_COPY_ROOT=%SOME_TEMP_VAR:~24%
  

Комментарии:

1. Это не сработает, если текущий подкаталог в данный момент не отслеживается как часть svn. Ошибка svn: предупреждение: W155010: узел ‘C:svnrootpathtofoldernotinsvn ‘не найден.

2. В неанглоязычных системах это может привести к сбою, поскольку текст будет локализован. Чтобы предотвратить это в Linux, добавьте строку export LC_ALL=C в свой скрипт.

Ответ №3:

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

Ответ №4:

В Linux с svn версии 1.9.3 (r1718519) я запускаю это: svn info --show-item wc-root

Комментарии:

1. Вы имели в виду wc-root? svn help info это указано в качестве опции, и, похоже, она работает правильно.

2. Да, это то, что я имел в виду. Я обновлю ответ.

Ответ №5:

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

редактировать: скрипт svnbase в предыдущем комментарии работает, но он неточный.

Комментарии:

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

Ответ №6:

на самом деле, если вы заглянете в свой файл .svn /entries, вы найдете базу, указанную там, обычно в строке 6. В любом случае формат вашего svn URL даст вам несколько важных подсказок: P О да, я взял на себя смелость посмотреть, и svn info также расскажу вам.

…вздох, это не то, что вы спрашивали. Мне нравится решение в первом ответе: P

Комментарии:

1. однако в информации svn указан корень вашего репозитория, а не рабочая копия. Таким образом, это не помогло бы, если бы вы не проверяли весь репозиторий, тогда как svnbase выше все равно помогло бы.

Ответ №7:

Попробуйте следующую команду на любой глубине вашей рабочей копии:

 svn info . --show-item wc-root --no-newline
  

Ответ №8:

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

 <#
    This command outputs the top-most parent of the current folder.

    If the current folder is not under svn revision control,
    it will recurse up one level, and try again.

    It stops at the root folder on the current drive.
    If the current folder's drive's root folder is not under svn revision control,
    it will throw an exception "No SVN Root Directory found."
#>
function Get-SvnRootDirectory {
    $currentDirectory = Get-Location

    do {
        $output = $(svn info $currentDirectory 2> $null)
        $output = $output | findstr /C:"Working Copy Root Path:"
        if ($LASTEXITCODE -eq 0)
        {
            break;
        }
        # if (Test-Path -PathType Container -Path $currentDirectory)
        # {
        #     throw "No SVN Root Directory found."
        # }
        $currentDirectory = Split-Path -Path $currentDirectory -Parent
        if ([string]::IsNullOrWhiteSpace($currentDirectory))
        {
            throw "No SVN Root Directory found."
        }
    }
    while ($true)

    $output -match "Working Copy Root Path: (?<Group>.*)$" | Out-Null
    return $Matches.Group
}