사용자 도구

사이트 도구


kb:perforcetips


Perforce / Tips

다른 사람이 락 걸어두고 간 파일 풀기

p4 login user
p4 -u user -c client -H host revert -k "//depot/dir/file"

어드민 권한 필요. 호스트 이름 모르면 -H 옵션 빼고 실행 하면 호스트 이름 나옴.

P4SCC 관련 파일들

  • MSSCCPRJ.SCC –> 유저별 소스 바인딩 옵션(퍼포스 서버 주소랑 워크스페이스 이름)에 대한 파일이다. 커밋하면 안 된다.
  • Solution.vssscc –> 커밋 필요. 자동으로 생성되고, 자동으로 커밋되는 듯?
  • Project.vspscc –> 커밋 필요. 자동으로 생성되고, 자동으로 커밋되는 듯?

별도의 디렉토리에 있는 작업본과 디팟 비교해서 변경 사항 적용하기

dirdiff 비슷한 내용. 소스보다는 데이터 파일 관리를 위해 필요하다. add/edit는 한 함수 안에서 처리할 수 있다만, 그냥 깔끔하게 분리했다.

require 'fileutils'
require 'zlib'
 
# 작업 디렉토리 루트 (퍼포스와 관련없는 디렉토리)
$WORKSPACE_ROOT = "depot"
 
# 퍼포스 워크스페이스
$DEPOT_ROOT = "working"         
 
# 루트 아래에서 비교할 디렉토리들
$DIRECTORIES = ["data"]
 
# 삭제할 파일 체크도 수행할 것인가?
$SCAN_FOR_DELETE = false
 
# CRC32 체크
def is_same_file(lhs_name, rhs_name)
    if File.size(lhs_name) == File.size(rhs_name) then
        lhs_file = File.new(lhs_name, 'r')
        rhs_file = File.new(rhs_name, 'r')
        result = true
        while not lhs_file.eof? do
            if Zlib::crc32(lhs_file.read(1024)) != Zlib::crc32(rhs_file.read(1024)) then
                result = false
                break
            end
        end
        lhs_file.close
        rhs_file.close
        return result
    else
        return false
    end
end
 
# 디팟에서 삭제해야할 파일들 검색
# (디팟에는 있지만 로컬에서는 삭제된 파일들)
def compare_for_delete(depot_path, working_path, bat_file)
    Dir.foreach(depot_path) { |name|
        next if name == '.' or name == '..'
 
        depot_full_name = File.join(depot_path, name)
        working_full_name = File.join(working_path, name)
 
        case File.ftype(depot_full_name)
            when "file"
                if File.exists?(working_full_name) == false then
                    command = "p4 revert \"" + depot_full_name + "\"\n"
                    command += "p4 delete \"" + depot_full_name + "\"\n"
                    command = command.gsub("/", "\\")
                    command = command.gsub(" \\y ", " /y ")
                    bat_file.write(command)
                end
            when "directory"
                compare_for_delete(depot_full_name, working_full_name, bat_file)
        end
    }
end
 
# 디팟에다 추가해야할 파일들 검색
# (로컬에는 있지만 디팟에는 없는 파일들)
def compare_for_add(depot_path, working_path, bat_file)
    if not File.exists?(depot_path) then
        return
    end
 
    if not File.exists?(working_path) then
        return
    end
 
    Dir.foreach(working_path) { |name|
        next if name == '.' or name == '..'
 
        working_full_name = File.join(working_path, name)
        depot_full_name = File.join(depot_path, name)
 
        case File.ftype(working_full_name)
            when "file"
                if not File.exists?(depot_full_name) then
                    command = "copy /y \"" + working_full_name + "\" \"" + depot_full_name + "\"\n"
                    command += "p4 add \"" + depot_full_name + "\"\n"
                    command = command.gsub("/", "\\")
                    command = command.gsub(" \\y ", " /y ")
                    bat_file.write(command)
                end
            when "directory"
                compare_for_add(depot_full_name, working_full_name, bat_file)
        end
    }
end
 
# 변경된 파일들 검색
# (로컬, 디팟 모두에 있으나 수정 날짜가 다른 파일들)
def compare_for_edit(depot_path, working_path, bat_file)
    if not File.exists?(depot_path) then
        return
    end
 
    if not File.exists?(working_path) then
        return
    end
 
    Dir.foreach(working_path) { |name|
        next if name == '.' or name == '..'
 
        working_full_name = File.join(working_path, name)
        depot_full_name = File.join(depot_path, name)
 
        case File.ftype(working_full_name)
            when "file"
                if File.exists?(depot_full_name) and is_same_file(working_full_name, depot_full_name) == false then
                    command = "p4 edit \"" + depot_full_name + "\"\n"
                    command += "copy /y \"" + working_full_name + "\" \"" + depot_full_name + "\"\n"
                    command = command.gsub("/", "\\")
                    command = command.gsub(" \\y ", " /y ")
                    bat_file.write(command)
                end
            when "directory"
                compare_for_edit(depot_full_name, working_full_name, bat_file)
        end
    }
end
 
bat_file = File.open("execute.bat", "w")
bat_file.write("@echo off\n")
 
for dir in $DIRECTORIES do
    depot = File.join($DEPOT_ROOT, dir)
    workspace = File.join($WORKSPACE_ROOT, dir)
 
    if $SCAN_FOR_DELETE then
        compare_for_delete(depot, workspace, bat_file)
    end
 
    compare_for_add(depot, workspace, bat_file)
    compare_for_edit(depot, workspace, bat_file)
end
 
bat_file.write("pause\n")

특정 Changelist 안에 있는 파일들 모두 롤백하기

파일 타입 매핑 인수

p4 typemap 명령어에 사용하는 인자들. p4 help filetypes 하면 나오는 내용들이다. 좀 더 자세한 내용은 여기를 참고…

base filetypes

Type Client Use Server Storage
text newlines translated deltas in RCS format
binary raw bytes compressed binary
symlink symbolic link deltas in RCS format
apple Mac resource + data compressed AppleSingle
resource Mac resource fork compressed binary
unicode newlines translated deltas in RCS format stored as UTF-8

modifiers

Modifier Meaning
+m always set modtime on client (overrides client's nomodtime)
+w always writable on client
+x exec bit set on client
+k $Keyword$ expansion of Id, Header, Author, Date, DateTime, Change, File, Revision
+ko $Keyword$ expansion of Id, Header only
+l exclusive open: disallow multiple opens
+C server stores compressed file per revision
+D server stores deltas in RCS format
+F server stores full file per revision
+S server stores only single head revision

디렉토리 안의 모든 파일 추가하기

dir /b /s /a-d | p4 -x - add

kb/perforcetips.txt · 마지막으로 수정됨: 2014/12/09 10:53 저자 excel96