だめ出しされるのを期待して(?)公開します。
目的
ファイルサーバを使って、原始的な方法*1で管理されてるファイルをこっそりSubversion(以降SVN)に取り込みたい。
将来的に、SVNに移行できたらいいなという思いがあるので。
前提
- SVNへのインポートは事前に行っている
- チェックアウトも事前にローカルHDDに行っている
仕様
- ファイルサーバからローカルのワークディレクトリへ同期を行う
- ディレクトリが存在しない場合は作成
- ファイルが存在しない場合はコピー
- ファイルサーバの方が日付が新しい場合は上書きコピー
- .svnファイルはもちろん削除対象外とする
- 同期しないファイル、ディレクトリを指定できるようにする
- ローカルにのみ存在するファイル・ディレクトリを削除
- .svnファイルはもちろん削除対象外とする
- SVNへコミット
ソース
こんな感じ。エラー処理は無しですが…
$from = 'X:\Work\test\From' $to = 'D:\Work\test\To' $excludeFrom = 'old','temp' $excludeTo = '.svn' $changed = $false Write-Host Write-Host "SVNリポジトリから最新の状態に更新します" Push-Location $to svn update Pop-Location Write-Host Write-Host "ファイルの同期を開始します" Get-ChildItem $from -Recurse -Exclude $excludeFrom | %{ $file = $_.FullName.Replace($from, "") $copyto = $to + $file if ($_.Attributes -eq 'Directory') { if (-not(Test-Path -literalpath $copyto)) { Write-Host "C : " $_.FullName.Replace($from, "") New-Item $copyto -itemType Directory -Force | Out-Null $changed = $true } }else{ if (-not(Test-Path -literalpath $copyto)) { Write-Host "A : " $file Copy-Item $_ $copyto $changed = $true }else{ if ($_.LastWriteTime -gt $(Get-Item -literalpath $copyto).LastWriteTime) { Write-Host "M : " $file ":" $(Get-Item -literalpath $copyto).LastWriteTime " ⇒ " $_.LastWriteTime Copy-Item $_ $copyto $changed = $true } } } } Get-ChildItem $to -Recurse -Exclude $excludeTo | %{ $file = $_.FullName.Replace($to, "") $originalfile = $from + $file if (-not(Test-Path -literalpath $originalfile )) { Write-Host "D : " $file Remove-Item $_ -Recurse -Force $changed = $true } } if ($changed) { Write-Host Write-Host "変更があったでSVNへのコミットを行います" Push-Location $to svn status | Select-String -pattern "^\?" | %{$_ -replace "^\? +",""} | %{svn add $_} svn status | Select-String -pattern "^!" | %{$_ -replace "^! +",""} | %{svn delete $_} svn commit -m"ファイルサーバと同期" Pop-Location }else{ Write-Host Write-Host "変更がなかったのでSVNへのコミットは行いません" }
*1:旧バージョンのファイルはファイル名に日付を付けて、oldディレクトリに放り込みましょう