Domanda

Il nostro codice è C ++ ed è gestito in svn. Lo sviluppo è con Visual Studio. Come sapete, Visual Studio C ++ non distingue tra maiuscole e minuscole per i nomi dei file e purtroppo il nostro codice "sfruttato" questo pesantemente.

No stiamo trasferendo la nostra applicazione su Linux + gcc, che distingue dalla distinzione tra maiuscole e minuscole. Ciò comporterà molti nomi di file e modifiche ai file. Abbiamo pianificato di fare lo sviluppo in un ramo separato.

Sembra che svn rename abbia un problema ben noto ( qui e qui ). C'è un modo per aggirare il problema? Git-svn o svnmerge possono essere d'aiuto qui?

Grazie Dima

È stato utile?

Soluzione

Il problema della distinzione tra maiuscole e minuscole non riguarda Visual Studio vs. GCC, ma piuttosto il filesystem; i filesystem standard su Windows e Mac OS X (FAT32 e NTFS per Windows, HFS + per Mac OS X) non fanno distinzione tra maiuscole e minuscole, ma mantengono la custodia, mentre i filesystem Linux (ext2, ext3 ed ext4) fanno distinzione tra maiuscole e minuscole. Ti suggerirei di rinominare i tuoi file, usando tutte le lettere minuscole per tutti i tuoi file sorgente, e poi branch e, ovviamente, per il futuro, hai una rigida politica di usare lettere minuscole e un " .cpp " estensione per tutti i file sorgente C ++ e " .h " per tutti i file di intestazione. C'è qualche motivo per cui non è possibile eseguire questa ridenominazione prima del ramo?

Altri suggerimenti

Git stesso si occupa (molto bene) del problema dei file rinominati nelle fusioni (e non solo lì) eseguendo contenuti euristici di file e somiglianza di nomi di file rilevamento di rinominazione . Non è necessario che vengano immesse informazioni sulla ridenominazione come soluzione di tracciamento della ridenominazione.

Ci sono due domande qui, una è la limitazione svn su rinominazioni e fusioni, secondo me una volta che si è deciso di andare con svn per un progetto, non sarebbe consigliabile cambiare il software di controllo della versione nel mezzo. Parlerei con gli altri sviluppatori e farei cicli di blocco dell'intero progetto e di rinominare.

Nel mio caso ho risolto i problemi con distinzione tra maiuscole e minuscole dei file di intestazione con un semplice script perl: correggerà i ritorni a capo e imposterà le lettere minuscole. La parte commentata corregge le inclusioni.

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

sub wanted
{
    if(  m/\.c$/i || m/\.h$/i ) {
        my $orig = 

Ci sono due domande qui, una è la limitazione svn su rinominazioni e fusioni, secondo me una volta che si è deciso di andare con svn per un progetto, non sarebbe consigliabile cambiare il software di controllo della versione nel mezzo. Parlerei con gli altri sviluppatori e farei cicli di blocco dell'intero progetto e di rinominare.

Nel mio caso ho risolto i problemi con distinzione tra maiuscole e minuscole dei file di intestazione con un semplice script perl: correggerà i ritorni a capo e imposterà le lettere minuscole. La parte commentata corregge le inclusioni.

<*>; 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, ".");

Come altri hanno detto, il problema originale non ha nulla a che fare con gli SCM, davvero. Per quanto riguarda l'utilizzo di git, è possibile eseguire l'unione in git-svn e reinserirla nel repository SVN - basta essere consapevoli in anticipo che questa è un'opzione unica, vale a dire, non aspettarsi che SVN realizzi che questo commit è stata un'unione o anche il fatto che i file siano stati rinominati - perderai la cronologia dei file a meno che tu non sia veramente attento

Come nota a fianco di " veramente attento " opzione, l'unico modo per fare in modo che git-svn spinga correttamente " rinomina file " informazioni su svn che sembrano funzionare in modo affidabile è rinominare i file in git-svn senza cambiare qualsiasi contenuto, eseguire il commit e quindi modificare qualsiasi file desiderato e fare un altro commit. Se modifichi il file rinominato prima di eseguire il commit, git-svn sa che il file è probabile spostato, ma apparentemente non si fida del suo euristico sufficiente per riportare queste informazioni su svn. È possibile che mi manchi qualche opzione magica che renda il lavoro migliore :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top