SVN переименовать проблему - PullRequest
       16

SVN переименовать проблему

1 голос
/ 04 августа 2009

Наш код - C ++ и управляется в SVN. Разработка ведется с помощью Visual Studio. Как вы знаете, Visual Studio C ++ нечувствителен к регистру имен файлов, и наш код, к сожалению, «эксплуатировал» это очень сильно.

Нет, мы переносим наше приложение на Linux + gcc, который чувствителен к регистру . Это будет включать в себя много имен файлов и изменений файлов. Мы планировали заняться разработкой в ​​отдельной ветке.

Похоже, что svn rename имеет хорошо известную проблему ( здесь и здесь ). Есть ли способ обойти это? Git-SVN или SVNMERGE может помочь здесь?

Спасибо Дима

Ответы [ 4 ]

4 голосов
/ 04 августа 2009

Проблема чувствительности к регистру связана не с Visual Studio и GCC, а с файловой системой; стандартные файловые системы в Windows и Mac OS X (FAT32 и NTFS для Windows, HFS + для Mac OS X) нечувствительны к регистру, но сохраняют регистр, тогда как файловые системы Linux (ext2, ext3 и ext4) чувствительны к регистру. Я бы посоветовал вам переименовать ваши файлы, используя все строчные буквы для всех ваших исходных файлов, а затем переходить, и - конечно же - на будущее, иметь строгую политику использования строчных букв и расширения ".cpp" для все исходные файлы C ++ и «.h» для всех заголовочных файлов. Есть ли причина, по которой вы не можете выполнить это переименование до ветки?

3 голосов
/ 04 августа 2009

Git сам по себе (очень хорошо) решает проблему переименованных файлов в слияниях (и не только там), выполняя эвристическое содержание файлов и сходство имен файлов на основе обнаружение переименования . Не требуется вводить информацию о переименованиях, например, решение для отслеживания переименований.

1 голос
/ 04 августа 2009

Как уже говорили, исходная проблема не имеет ничего общего с SCM. Что касается использования git, вы можете выполнить слияние в git-svn и отправить его обратно в репозиторий SVN - просто заранее знайте, что это одноразовый вариант, то есть не ожидайте, что SVN поймет, что этот коммит произошло слияние или даже переименование файлов - вы потеряете историю файлов, если вы не будете действительно осторожны.

В качестве дополнительного примечания, наряду с опцией «очень осторожно», единственный способ заставить git-svn правильно передать информацию о «переименовании файлов» в svn, которая, кажется, работает надежно, - переименовать файлы в git-svn без изменения любое содержимое, зафиксируйте, а затем измените все файлы, которые вы хотите, и сделайте еще один коммит. Если вы изменяете переименованный файл перед фиксацией, git-svn знает, что файл был перемещен , вероятно, , но, очевидно, не доверяет своей собственной эвристике, чтобы передать эту информацию обратно в svn. Вполне возможно, что мне не хватает какой-то волшебной опции, которая делает эту работу лучше:)

1 голос
/ 04 августа 2009

Здесь есть два вопроса, один из них - ограничение SVN на переименования и слияния, по моему мнению, когда кто-то решил использовать svn для проекта, было бы нецелесообразно переключать ПО контроля версий в середине. Я разговаривал с другими разработчиками и делал циклы блокировки всего проекта и переименования.

В моем случае я решил чувствительные к регистру проблемы заголовочных файлов с помощью простого perl-скрипта: он исправит возврат каретки и установит включения в нижний регистр. В комментируемой части исправления включены.

#!/usr/bin/perl
use strict;
use warnings;
#
use File::Find;
use File::Copy;

sub wanted
{
    if(  m/\.c$/i || m/\.h$/i ) {
        my $orig = $_;
        my $bak = $orig.".bak";
        my $dst = $orig;
        system("fromdos",$orig) == 0 or die "fromdos: $?";
#       open(FH,'<',$orig) or die "open $orig: $!";
#       my @lines;
#       while(my $line = <FH>) {
#           if( $line =~ m/(^#include\s+")([^"]+)(".*)$/ ) {
#               print $line;
#               my $inc = $2;
#               $inc =~ tr/A-Z/a-z/;
#               print "change to:\n";
#               print $1.$inc.$3."\n";
#               print "\n";
#               push @lines, $1 . $inc . $3."\n";
#           } else {
#               push @lines,$line;
#           }
#       }
#       close(FH);
#       #move($orig,$bak) or die "move $orig to $bak: $!";
#       unlink($orig);
#       open(FH, '>', $dst) or die "open $dst: $!";
#       print FH @lines;
#       close(FH);

    }
}

find(\&wanted, ".");
...