だめ出しされるのを期待して(?)公開します。
目的
ファイルサーバを使って、原始的な方法*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ディレクトリに放り込みましょう