- ´ë¼Ò¹®ÀÚ ¹®Á¦ ÇØ°áÇϱâ
- TortoiseSVN ºôÆ®ÀÎ diff°¡ ÀÛµ¿ÇÏÁö ¾ÊÀ» °æ¿ì
- ÆÄÀÏ À̸§ÀÇ ÄÉÀ̽º¸¸ º¯°æÇÏ´Â À̸§ ¹Ù²Ù±â (UPPERcase --> upperCASE)
- ù¹øÂ° ¹æ¹ý
- µÎ¹øÂ° ¹æ¹ý
- ÆÄÀÏÀ» »èÁ¦ÇÑ ´ÙÀ½, ¹Ù·Î °°Àº À̸§ÀÇ ÆÄÀÏÀ» »õ·Î »ý¼ºÇÏ´Â °æ¿ìÀÇ ¹®Á¦
- ÀÌ»óÇÑ Æ®·£Àè¼Ç Á¦°ÅÇϱâ
1 ´ë¼Ò¹®ÀÚ ¹®Á¦ ÇØ°áÇϱâ
À©µµ¿ì ȯ°æ¿¡¼ »ç¿ëÇÏ´Â °æ¿ì, ´ë¼Ò¹®ÀÚ ¶§¹®¿¡ ¹®Á¦°¡ »ý±ä´Ù. ¿¹¸¦ µé¾î µÎ ´ëÀÇ ÄÄÇ»ÅÍ¿¡¼ °¢°¢ "aa.txt"¿Í "AA.txt"¸¦ Ãß°¡ÇÏ´Â °æ¿ì, ¼ºê¹öÀü ¼¹ö´Â µÎ ÆÄÀÏÀ» ´Ù¸¥ °ÍÀ¸·Î ÀνÄÇØ µÑ ¸ðµÎ¸¦ µ¥ÀÌÅͺ£À̽º¿¡´Ù Ãß°¡ÇÑ´Ù. ³ªÁß¿¡ ¾÷µ¥ÀÌÆ® ¹ÞÀ¸·Á°í Çϸé, µÑ Áß¿¡ Çϳª¸¦ ¸ÕÀú ¹ÞÀ» °ÍÀ̰í, µÎ¹øÂ° ÆÄÀÏÀº »ý¼º½Ã ½ÇÆÐÇÏ°Ô µÈ´Ù. (À©µµ¿ìÁî »ó¿¡¼ µÎ ÆÄÀÏÀº °°Àº ÆÄÀÏÀ̴ϱñ.) ±×·¯¹Ç·Î ÆÄÀÏ À̸§¿¡ µé¾î°¡´Â ´ë¼Ò¹®ÀÚ¸¦ »ó´çÈ÷ ½Å°æ½á¾ß ÇÑ´Ù.
ÀÌ ¹®Á¦¸¦ ÇØ°áÇÏ´Â ¹æ¹ýÀÌ ¾ø´Â°¡ »ý°¢Çß¾ú´Âµ¥, pre-commit hookÀ̶ó´Â °ÍÀÌ ÀÖ´Â ¸ð¾çÀÌ´Ù. ÆÄÀÏÀ» Ä¿¹ÔÇϱâ Àü¿¡ È£ÃâÇÒ ÇÔ¼ö¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù´Â ¸»ÀÌ´Ù. ¾î¶»°Ô ÁöÁ¤ÇÏ´ÂÁö´Â Â÷Â÷ ¾Ë¾ÆºÁ¾ß°Ú´Ù. ÀÏ´Ü Áö±ÝÀº ±ÍÂúÀ¸´Ï ÆÐ½º.
#!/usr/bin/perl
use strict;
my $svnlook = '/usr/local/bin/svnlook';
my $repos = $ARGV[0];
my $txn = $ARGV[1];
my @added; # Each added path put here.
my %tree; # The file tree as a hash, index lower cased name, value actual name.
my $cmd; # Command being executed.
# Get a list of added files.
local *SVNLOOK;
$cmd = $svnlook . ' changed ' . $repos . ' --transaction ' . $txn;
open(SVNLOOK, '-|:utf8', $cmd) || die($cmd);
while (<SVNLOOK>) {
chomp;
if (/^A\s+(.*)/) {
push @added, $1;
}
}
close SVNLOOK;
# Get the shortest directory name which has changed, this will be the path
# into the repository to use to get the history.
$cmd = $svnlook . ' dirs-changed ' . $repos . ' --transaction ' . $txn;
open(SVNLOOK, '-|:utf8', $cmd) || die($cmd);
my $shortest=999999;
my $changed;
while (<SVNLOOK>) {
chomp;
if (length($_) < $shortest) {
$changed = $_;
$shortest = length($_);
}
}
close SVNLOOK;
# Use the history of $changed path to find the revision of the previous commit.
$cmd = $svnlook . ' history ' . $repos . ' ' . $changed;
open(SVNLOOK, '-|:utf8', $cmd) || die($cmd);
my $lastrev;
while (<SVNLOOK>) {
chomp;
if (/(\d+)/) {
$lastrev = $1;
last;
}
}
# Get the file tree at the previous revision and turn the output into
# complete paths for each file.
my @path;
$cmd = $svnlook . ' tree ' . $repos . ' --revision ' . $lastrev;
open(SVNLOOK, '-|:utf8', $cmd) || die($cmd);
while (<SVNLOOK>) {
chomp;
next if (/^\/$/); # Ignore the root node.
if (/^(\s+)(.*)\/$/) { # Is a directory.
$#path = length($1)-2; # Number of spaces at start of line is nest level.
push @path, $2;
} elsif (/^\s+(.*)$/) { # This is a real file name, not a directory.
my $name = join('/', @path) . '/' . $1;
$tree{lc($name)} = $name; # Index the hash with case folded name.
}
}
close SVNLOOK;
my $failmsg;
foreach my $newfile (@added) {
if (exists($tree{lc($newfile)})) {
$failmsg .= "\n $newfile already exists as " . $tree{lc($newfile)};
}
}
if (defined($failmsg)) {
die "\nFile name case conflict found:\n" . $failmsg . "\n";
}
exit 0;
2 TortoiseSVN ºôÆ®ÀÎ diff°¡ ÀÛµ¿ÇÏÁö ¾ÊÀ» °æ¿ì
Àӽà ÆÄÀÏ °æ·Î¿¡ ÇѱÛÀÌ µé¾î°¡´Â °æ¿ì, Á¤»óÀûÀ¸·Î ÀÛµ¿ÇÏÁö ¾Ê´Â´Ù. ¿µ¹®À¸·Î¸¸ ÀÌ·ç¾îÁø µð·ºÅ丮¸¦ Çϳª ¸¸µé°í, ±× °æ·Î¸¦ TEMP ¹× TMP·Î ¼³Á¤ÇÏ¸é µÈ´Ù. ¹«¾ùº¸´Ùµµ »ç¿ëÀÚ °èÁ¤À» Çѱ۷Π¸¸µéÁö ¸»Áö¾î´Ù.
3 ÆÄÀÏ À̸§ÀÇ ÄÉÀ̽º¸¸ º¯°æÇÏ´Â À̸§ ¹Ù²Ù±â (UPPERcase --> upperCASE)
¹Ýµå½Ã ¼ºê ¹öÀü ³»ºÎ¿¡¼ À̸§À» º¯°æÇØ¾ß ÇÑ´Ù. ÀͽºÇ÷η¯¿¡¼ À̸§À» º¯°æÇÏ´Â °æ¿ì, ¿öÅ· Ä«Çǰ¡ ¿À¿°µÇ¾î ¾µ ¼ö ¾ø°Ô µÈ´Ù.
3.1 ù¹øÂ° ¹æ¹ý
- ¿öÅ· Ä«ÇÇ ³»ºÎÀÇ º¯°æ »çÇ×À» commitÇÑ´Ù.
- Repository Browser¸¦ ÀÌ¿ëÇØ ÇØ´ç ÆÄÀÏÀÇ À̸§À» º¯°æÇÑ´Ù.
- ¿öÅ· Ä«ÇǸ¦ »èÁ¦Çϰí, »õ·Î checkoutÀ» ÇÑ´Ù. ±×³É update¸¦ ÇÏ¸é ¿¡·¯ ¸Þ½ÃÁö¸¦ º¸°Ô µÉ °ÍÀÌ´Ù.
Àüü ¿öÅ· Ä«ÇǸ¦ »õ·Î checkoutÇÏ°í ½ÍÁö ¾Ê´Ù¸é, ¹æ±Ý À̸§À» º¯°æÇÑ ÆÄÀÏÀ̳ª µð·ºÅ丮°¡ Æ÷ÇԵǾî ÀÖ´Â ºÎ¸ð µð·ºÅ丮¸¦ »èÁ¦(ÀͽºÇ÷η¯¿¡¼)Çϰí, update¸¦ ¼öÇàÇ϶ó.
3.2 µÎ¹øÂ° ¹æ¹ý
- rename ¸í·ÉÀ» ÀÌ¿ëÇØ UPPERcase¸¦ UPPERcase_·Î º¯°æÇÑ´Ù. Áï ÄÉÀ̽º¸¸ Ʋ¸° °ÍÀÌ ¾Æ´Ï¶ó ¿ÏÀüÈ÷ ´Ù¸¥ À̸§À¸·Î º¯°æÇØ¾ß ÇÑ´Ù.
- º¯°æ »çÇ×À» commit.
- ´Ù½Ã rename ¸í·ÉÀ» ÀÌ¿ëÇØ UPPERcase_¸¦ upperCASE·Î º¯°æÇÑ´Ù.
- º¯°æ »çÇ×À» commit.
4 ÆÄÀÏÀ» »èÁ¦ÇÑ ´ÙÀ½, ¹Ù·Î °°Àº À̸§ÀÇ ÆÄÀÏÀ» »õ·Î »ý¼ºÇÏ´Â °æ¿ìÀÇ ¹®Á¦
AAA ¶ó´Â ÆÄÀÏÀ» delete ¸í·ÉÀ» ÀÌ¿ëÇØ »èÁ¦Çß´Ù. ±× ´ÙÀ½ °°Àº À̸§ÀÇ ÆÄÀÏÀ» add ¸í·ÉÀ» ÀÌ¿ëÇØ Ãß°¡Çß´Ù. ±× ´ÙÀ½ commitÀ» ¼öÇàÇÏ¸é ¿¹»Û ¿¡·¯ ¸Þ½ÃÁö¸¦ º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. SubversionÀÌ ÇöÀç ¿öÅ· Ä«ÇÇ ³»ºÎ¿¡ ÀÖ´Â AAA¶ó´Â ÆÄÀÏÀ» »èÁ¦ÇØ¾ß µÇ´Â °ÍÀÎÁö, Ãß°¡ÇØ¾ß ÇÏ´Â °ÍÀÎÁö ÆÇ´ÜÇÏÁö ¸øÇϱ⠶§¹®ÀÌ´Ù.
¿Ã¹Ù¸¥ ÀÛ¾÷ÀÇ ¼ø¼´Â ´ÙÀ½°ú °°´Ù.
- ÆÄÀÏÀ» ´Ù¸¥ ¾îµò°¡·Î ¿Å±ä´Ù.
- º¯°æ »çÇ×À» commitÇÑ´Ù. ÀÌ´Â Subversion¿¡°Ô ÆÄÀÏÀÌ »èÁ¦µÇ¾ú´Ù´Â °ÍÀ» ¾Ë·ÁÁØ´Ù.
- ¿Å°å´ø ÆÄÀÏÀ» ¿ø·¡ À§Ä¡·Î ´Ù½Ã °¡Á®¿Â´Ù.
- º¯°æ »çÇ×À» commitÇÑ´Ù.
5 ÀÌ»óÇÑ Æ®·£Àè¼Ç Á¦°ÅÇϱâ
svnadmin lstxns REPO_PATH ¸í·ÉÀ» ÀÌ¿ëÇϸé ÇöÀç ÁøÇàÁßÀÎ Æ®·£Àè¼ÇÀÌ ³ª¿Â´Ù. ¹®Á¦´Â Ŭ¶óÀÌ¾ðÆ® »çÀ̵忡¼ ¿¡·¯°¡ ¹ß»ýÇÑ °æ¿ì, ÀÌ Æ®·£Àè¼ÇÀÌ °è¼Ó ³²¾ÆÀÖ´Ù´Â Á¡ÀÌ´Ù. ¿øÀÎÀº ¸ð¸£°Ú´Ù.
svnadmin rmtxns REPO_PATH TRNX_NAME ¸í·ÉÀ» ÀÌ¿ëÇÏ¸é Æ®·£Àè¼ÇÀ» Ãë¼Ò½Ãų ¼ö ÀÖ´Ù. TRNX_NAMEÀº lstxns ¸í·ÉÀ¸·Î ³ª¿À´Â À̸§µéÀε¥, ÀÏÀÏÀÌ ÀÔ·ÂÇÏ´Â °ÍÀº ±ÍÂúÀ¸´Ï, ´ÙÀ½°ú °°Àº ¹èÄ¡ ÆÄÀÏ·Î...
@echo off
echo "ÇöÀç Æ®·£Àè¼Ç ¸ñ·Ï..."
svnadmin lstxns d:\svn\cuvit\
echo "Á¦°ÅÇϽðڽÀ´Ï±î?"
choice
If %errorlevel% == 2 exit
FOR /F "tokens=1 delims=," %%i IN ('svnadmin lstxns d:\svn\cuvit\') DO svnadmin rmtxns d:\svn\cuvit\ %%i
svnadmin recover d:\svn\cuvit\
pause
SeriousMoin v1 (koMoinMoin 1.0a4 Modified)