Subversion, пометить файл как удаленный или перемещенный по факту - PullRequest
17 голосов
/ 29 июня 2011

Допустим, у меня есть два файла в репозитории Subversion:

workingcopy/
  file1.txt
  file2.txt

А потом я переименую один, внешний по отношению к SVN:

$ mv file1.txt fileA.txt

Теперь SVN помечает file1.txt как отсутствующий, fileA.txt как неверсированный

$ svn st
!   file1.txt
?   fileA.txt

Насколько SVN знает, я удалил file1.txt и создал совершенно другой файл fileA.txt, поэтому он не будет знать, как отслеживать изменения между файлами.


РЕДАКТИРОВАТЬ: это работает, я просто не могу правильно записать имена файлов:)

Аналогично, если вы удаляете файл

$ rm file2.txt
$ svn st
!   file2.txt

SVN знает только, что файл пропал, и попытка пометить его как удаленный не работает:

$ svn remove file2.txt
svn: 'file2.txt' does not exist

Я знаю, что в Mercurial вы можете пометить файл как перемещенный, скопированный, удаленный и т. Д. После факта с помощью флага --after, независимо от того, что Mercurial видит в рабочей копии.

Есть ли похожий трюк в SVN?

Ответы [ 5 ]

12 голосов
/ 29 июня 2011

Может быть, вам нужно обновить вашу версию Subversion:

$ svn --version
svn, version 1.6.16 (r1073529)

$ rm data.xml

$ svn status
!       data.xml

$ svn rm data.xml
D       data.xml

$ svn status
D       data.xml

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

#!/bin/sh

mv $2 $1
svn rename $1 $2

Или просто для интереса вы можете добавить в ваш .bashrc или .bash_profile следующее:

svn_mv_after() 
{
        mv $2 $1
        svn mv $1 $2
}

alias svnmva=svn_mv_after
8 голосов
/ 24 января 2013

Если вы используете TortiseSVN, вы можете сделать это с экрана фиксации. Щелкните правой кнопкой мыши на удаленном и добавленном файле (тот же файл, только что перемещенный), и вы получите возможность восстановить перемещение.

http://tortoisesvn.net/repairmoves.html

2 голосов
/ 29 июня 2011

Нет, у SVN такого нет, потому что вы оставили SVN, используя команду «mv ..» вместо «svn mv ...» для «rm ...», это тоже самое ...

SVN следует за именами файлов с метаинформацией «содержимое», тогда как в git, hg и bzr содержимое сопровождается именем файла метаинформации.Вот почему вы можете делать что-то в git, hg (я не знаю), bzr (я тоже не знаю), если вы можете использовать команды операционной системы для переименования и удаления файлов.

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

svn revert deleted.file.ext

svn rm deleted.file.ext

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

mv file1.txt fileA.txt

, вы можете сделать то же самое

svn revert file1.txt

сначала удалить файл A.txt, а затем

svn mv file1.txt fileA.txt

Если вы изменили что-то в переименованном файле (fileA.txt), просто сделайте копию этого файла и выполните ту же процедуру и замените содержимое файла после «svn mv ...»

0 голосов
/ 20 августа 2015

Я немного скорректировал решение @Peter Sutton для обработки случаев, когда каталог для SRC отсутствует, каталог для DST еще не версионирован, и принимает необязательный третий параметр FILE, если источник и пункт назначенияимена файлов одинаковы (если указано FILE, SRC и DST являются каталогами).Опять же, необходим realpath, и я проверял это только в Cygwin с версией SVN 1.8.11.Резервное копирование обрабатывается с помощью mv -b, что приведет к загрязнению любого файла на $src~, и любые ненужные каталоги, созданные mkdir, необходимо будет удалить вручную.

svma() {
    local dst src tmp

    # Check arguments
    if [[ ( $# != 2 ) && ( $# != 3 ) ]]; then
        echo 'Usage: svma SRC DST [FILE]'
        return 1
    fi

    # Ensure paths start with a slash, not a dash
    src=$(realpath -- "$1")
    dst=$(realpath -- "$2")

    if [[ $# == 2 ]]; then
        srcdir=$(dirname "$src")
        dstdir=$(dirname "$dst")
    else
        srcdir="$src"
        dstdir="$dst"
        src="$srcdir/$3"
        dst="$dstdir/$3"
    fi

    mkdir -p "$srcdir"
    svn add "$dstdir" --parents --depth=empty --force

    # Restore the source and then have Subversion move it
    mv -b "$dst" "$src"
    svn mv "$src" "$dst"

    # If required, move the backed-up file back to the source path
    if [[ -e "$src~" ]]; then
        mv "$src~" "$src"
    fi
}
0 голосов
/ 26 августа 2013

Я использую Arch Linux и у меня в .bashrc есть следующее.Он может обрабатывать новый файл, находящийся в том месте, откуда вы переместили исходный код, и должен иметь возможность принимать самые странные пути (например, начиная с тире или содержать пробелы).Вы должны установить realpath.

svma() {
    local dst src tmp

    # Check arguments
    if [[ $# != 2 ]]; then
        echo 'Usage: svma SRC DST'
        return 1
    fi

    # Ensure paths start with a slash, not a dash
    src=$(realpath -- "$1")
    dst=$(realpath -- "$2")

    # If there is a new file at the path of the source, move it to a
    # temporary name in the same directory
    if [[ -e "$src" ]]; then
        tmp=$(mktemp "--tmpdir=$(dirname "$src")" -u)
        mv "$src" "$tmp"
    fi

    # Restore the source and then have Subversion move it
    mv "$dst" "$src"
    svn mv "$src" "$dst"

    # If required, move the new file back to the source path
    if [[ -v tmp ]]; then
        mv "$tmp" "$src"
    fi
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...