问题
Quite often I'm sitting in the middle of a subversion working copy, and I want to do a quick svn status
to find out what changes I have made since the last checkin. However svn status
only works on the current folder and it's children. (Similarly for svn up
too)
I'd like a quick way to change to the root folder of the subversion working copy so I can run a svn status
and see all files that have changed, maybe a checkin or a update, and then get back to work where I was before.
回答1:
Here's my first go at an answer: I wrote a little bash script called 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
So now I can do this:
[~/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]$
回答2:
If you use git-svn as your Subversion client, then you can interact transparently with a Subversion repository using Git commands locally. Git automatically shows you pending across the whole repository when you use commands like git status anywhere in the tree.
回答3:
On Windows:
svn info . |findstr /C:"Working Copy Root Path:"
On Linux:
svn info . |grep -F "Working Copy Root Path:"
It can be assigned to a variable using a little string manipulation. Windows version:
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%
回答4:
On linux with svn, version 1.9.3 (r1718519), I run this:
svn info --show-item wc-root
回答5:
It is not possible. SVN can be checked out from any depth, and any subdir acts like brand new checkout.
edit: svnbase script in prev comment works, but it is not precise.
回答6:
actually, if you look in your .svn/entries file, you'll find the base listed in there usually around line 6. In any event, the format of your svn url will give you some significant clues :P
Oh yeah, i took the liberty of looking, and svn info
will also tell you.
...sigh, that's not what you asked though. I like the solution in the first answer :P
回答7:
Try the following command at any depth of your working copy:
svn info . --show-item wc-root --no-newline
回答8:
Here is my solution, which is a hybrid of various solutions put here. It is written in PowerShell, as I needed it for a PowerShell module I am writing.
<#
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
}
来源:https://stackoverflow.com/questions/1242364/how-can-i-find-the-root-folder-of-a-given-subversion-working-copy