1

私たちのコードは C++ で、svn で管理されています。開発はVisual Studioで行っています。ご存じのように、Visual Studio C++ はファイル名の大文字と小文字を区別しません。残念ながら、私たちのコードはこれを大きく「悪用」しました。

いいえ、大文字と小文字を区別する Linux + gcc にアプリケーションを移植しています。これには、多くのファイル名とファイルの変更が含まれます。別のブランチで開発を行う予定でした。

svn rename にはよく知られた問題があるようです (ここここ)。それを回避する方法はありますか?git-svn または svnmerge はここで役立ちますか?

ありがとうディマ

4

4 に答える 4

4

大文字と小文字の区別の問題は、Visual Studio と GCC の違いではなく、ファイル システムの問題です。Windows と Mac OS X の標準ファイルシステム (Windows では FAT32 と NTFS、Mac OS X では HFS+) は大文字と小文字を区別しませんが、大文字と小文字を保持します。一方、Linux ファイルシステム (ext2、ext3、および ext4) は大文字と小文字を区別します。すべてのソース ファイルにすべて小文字を使用して、ファイルの名前を変更してから分岐することをお勧めします。もちろん、将来的には、小文字と ".cpp" 拡張子を使用するという厳密なポリシーを設定してください。すべての C++ ソース ファイルと、すべてのヘッダー ファイルの「.h」。ブランチの前にこの名前変更を実行できない理由はありますか?

于 2009-08-04T07:46:25.793 に答える
3

Git 自体は、ヒューリスティックなファイル コンテンツとファイル名の類似性に基づく名前変更の検出を行うことで、マージでの名前変更されたファイルの問題 (およびそこだけでなく) を (非常にうまく) 処理します。名前変更追跡ソリューションのように、名前変更に関する情報を入力する必要はありません。

于 2009-08-04T07:39:54.010 に答える
1

他の人が言ったように、元の問題は実際には SCM とは何の関係もありません。git の使用に関しては、git-svn でマージを実行し、それを SVN レポジトリにプッシュすることができます。これは 1 回限りのオプションであることを事前に知っておいてください。つまり、このコミットが SVN に認識されることを期待しないでください。マージであったか、ファイルの名前が変更された場合でも、十分に注意しない限り、ファイルの履歴が失われます。

「本当に慎重な」オプションと並んで補足として、git-svn が正しい「ファイルの名前変更」情報を svn にプッシュし、確実に動作しているように見える唯一の方法は、内容を変更せずに git-svn のファイルの名前を変更しコミットして、次に、必要なファイルを変更して、別のコミットを行います。コミットする前に名前が変更されたファイルを変更すると、git-svn はファイルが移動された可能性が高いことを認識しますが、この情報を svn にプッシュするのに十分な独自のヒューリスティックを信頼していないようです。この作業を改善する魔法のオプションが欠けている可能性は十分にあります:)

于 2009-08-04T17:12:35.757 に答える
1

ここで 2 つの質問があります。1 つは、名前の変更とマージに関する 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, ".");
于 2009-08-04T08:26:31.687 に答える