Programing

Team Foundation Server-기록과 함께 소스 이동

lottogame 2020. 12. 26. 09:24
반응형

Team Foundation Server-기록과 함께 소스 이동


한 팀 프로젝트에서 다른 팀 프로젝트로 기록과 함께 소스 코드를 이동하는 가장 좋은 방법이 무엇인지 궁금합니다. 복원 할 시스템에서 이러한 기능을 사용하지 않았기 때문에 작업 항목,보고 또는 SharePoint 사이트에 대해서는 관심이 없습니다. 다른 팀 프로젝트로 이동하려는 이유는 원래 구현 (타사에서 유지 관리하는 백업에서 복원 됨)이 사용하지 않으려는 타사 프로세스 템플릿을 사용했기 때문이기도합니다. 앞으로. 마이그레이션이 완료된 후 작업 항목 추적 및보고 활용을 시작하려고합니다.

TFS 통합 플랫폼은 하나 개의 가능성 시나리오 것 같다. 문서에 따라 프로세스 템플릿을 변경하는 데 사용할 수 있습니다. 그러나 tf.exe 이동 구문이 작동하는지 궁금합니다. 다음과 같은 것 :

tf.exe 이동 $ / ProjectA $ / ProjectB

이 명령은 이름 바꾸기 작업과 매우 유사하지만 소스 제어 탐색기에서 "이동"컨텍스트 메뉴 항목으로 이동하는 것은 삭제 및 추가 작업과 비슷하다는 것을 이해합니다. 또한 $ / ProjectA가 한 프로젝트의 루트 소스 제어 폴더이고 $ / ProjectB가 다른 프로젝트의 루트 소스 제어 폴더라고 가정하면 tf.exe 이동 경로가 실제로 폴더 아래의 코드를 적절한 팀 프로젝트와 연결합니까? 핵심은 가능하다면 역사를 보존 할 수있는 것입니다.

조언이나 조언을 주시면 대단히 감사하겠습니다!

편집-Microsoft가 분기 지침 문서 에서 논의한 것처럼 다른 프로젝트로 분기하여이 시나리오를 처리 할 수 있습니까? 역사가 지부와 함께 보존 될 가능성이 높기 때문에 이것이 답이 될 수 있다고 생각합니다. 그러나 지금은 테스트 할 Team Foundation Server 2008 인스턴스에 액세스 할 수 없습니다.


이동 및 이름 바꾸기는 별칭입니다. TFS의 모든 버전에서 명령 줄 또는 UI와는 전혀 차이가 없습니다.

둘 다 역사를 보존합니다. 최소한 2005/2008 년에는 이름 및 / 또는 상위 경로가 얼마나 자주 또는 얼마나 크게 변경 되더라도 VersionedItem 테이블에서 동일한 물리적 항목을 유지합니다. 실제로 많은 수동 작업 없이는 "가짜"이름 바꾸기 (삭제 + 추가)를 수행 할 수 없습니다.

그러나이 버전 관리 모델은 이론적 의미에서 매우 순수하지만 실용적인 문제가 있습니다. 서로 다른 항목이 서로 다른 시점에서 동일한 이름을 차지할 수 있으므로 TFS는 전송하는 모든 입력을 고유하게 식별하기 위해 전체 이름 + 버전이 필요합니다. 일반적으로이 제한을 알아 차리지 못하지만 시스템에서 항목의 이름을 변경 한 후 tf [doSomething] $ / newname -version : oldversion 이라고 말하면 혼란스러워지고 오류가 발생하거나 항목에 대해 작업 할 수 있습니다. 의도하지 않았습니다. 명령이 원하는 방식으로 작동하도록하려면 유효한 조합 (newname + newversion 또는 oldname + oldversion)을 전달하도록주의해야합니다.

TFS 2010은 스토리를 다소 변경합니다. 이는 항목 ID가 변경되도록하는 분기 + 삭제입니다. 그럼에도 불구하고 Get 및 History와 같은 일상적인 명령은 매우 "가짜"입니다. 이전 클라이언트는 약 95 % 호환됩니다. 장점은 시스템에서 이름을 여러 번 변경하고 경로 기반 항목 조회가 위에서 언급 한 것처럼 모호해지기 시작하면 서버가 사용자가 지정한 이름을 받아들이고 함께 실행한다는 것입니다. 이렇게하면 전체 시스템 성능이 향상되고 익숙하지 않은 사용자가 자주 빠지는 몇 가지 트랩이 제거됩니다. 유연성이 떨어지고 100 % 정밀도로 히스토리를 보존하지 않는 비용 (예 : 두 분기 병합 중에 이름 충돌이있는 경우)이 발생합니다.

당면한 문제로 돌아가는 중 ...

tf rename $ / projectA $ / projectB 라고 말하는 것만 큼 간단하지 않습니다 . 소스 제어 트리의 최상위 폴더는 팀 프로젝트 생성 마법 사용으로 예약되어 있습니다. 표준 tf 명령을 실행할 수 없습니다. 필요한 것은 다음과 같은 스크립트입니다.

Get-TfsChildItem $/ProjectA |
    select -Skip 1 |  # skip the root dir
    foreach {
        tf rename $_.serveritem $_.serveritem.replace("$/ProjectA", "$/ProjectB")
    }

[물론 $ / ProjectA 미만의 자녀가 많지 않다면 손으로 할 수 있습니다]

내가 언급 한 문제들에 관해서는 오래된 역사를 찾는 것이 당신에게 매우 중요해 보이기 때문에 지금 당장 하나에 대해 자세히 설명하겠습니다. 이름을 변경하면 tf history $ / ProjectA / somefile.cs 가 작동하지 않습니다. 기본적으로 tf 명령은 버전 = "최신"이라고 가정합니다. 이러한 대안은 원하는 전체 기록이됩니다.

  • tf history $ / ProjectA / somefile.cs; 1234 여기서 변경 세트 1234는 이동 전이었습니다.
  • tf history $ / ProjectB / somefile.cs; 5678 여기서 변경 세트 5678은 이동 후였습니다. 또는 버전을 생략 할 수도 있습니다.

완전성 및 디버깅 목적을위한 최종 대안 :

  • tf 기록 $ / ProjectA / somefile.cs -slotmode . 이동 전에 발생한 변경 사항 만 볼 수 있습니다. 그러나 B 아래로 이동 한 항목 이전 또는 이후에 $ / ProjectA / somefile.cs "슬롯"에있을 수있는 다른 항목의 기록도 볼 수 있습니다.

(TFS 2010에서는 "슬롯 모드"가 기본 동작입니다. 경로 기반이 아닌 2008 년처럼 기록에서 조회를 추적하도록 요청하는 -ItemMode 옵션이 있습니다.)

편집-아니요, 분기는 훌륭한 대안이 아닙니다. 분기는 ProjectB와의 전체 기록을 추적 할 수있는 충분한 메타 데이터를 시스템에 남겨 두지 만 2008 년에는 사용자 친화적이지 않습니다. tf merges 명령을 배우는 데 많은 시간을 할애 할 계획입니다 (UI에 해당하지 않음). 2010 년은 여러 지점에서 변경 사항을 시각화하는 능력을 크게 향상 시켰지만 여전히 이름 바꾸기를 통해 얻을 수있는 깨끗한 통합 경험은 아닙니다.


위의 Richard의 답변은 잘 작성되어 있으며 상황을 잘 설명합니다. 그러나 추가해야 할 몇 가지 실용적인 문제가 있습니다.

TFS2010에서 기본 동작은 파일을 이동하면 이동 전의 모든 기록이 손실되는 것처럼 보입니다 . 내 사용자가 사용하는 명령 (및 VS2010 GUI에서 사용되는 명령)은 다음과 같습니다.

tf history $/ProjectB/somefile.cs

내 사용자는 이동 전후에 somefile.cs의 모든 기록을 얻으려고합니다. 그들은 어떤 시점에서든 파일 이름에 관계없이 "현재 $ / ProjectB / somefile.cs에 저장된 코드의 기록"을 원합니다. 다른 사람들이 다르게 볼 수도 있습니다.

첫 번째 문제는 TFS2010을 사용하여 VS2010에 표시되는 GUI가 이동 이후의 기록 만 표시한다는 것입니다. 목록에서 가장 최근의 항목은 이름 바꾸기 작업입니다. 미묘한 작은 드롭 다운 화살표로 확장 할 수 있습니다. 아래는 이전 위치의 기록입니다. 이것을 찾는 방법을 모르면 역사가 사라진 것처럼 보일 수 있습니다.

두 번째 문제는 나중에 ProjectA를 삭제하면 (예를 들어 ProjectB 로의 마이그레이션이 완료 되었기 때문에) 기록이 실제로 사라진다는 것입니다. $ / ProjectB / somefile.cs의 기록에서 드롭 다운을 확장해도 이전 기록이 생성되지 않습니다.


또 다른 옵션 (그리고 더 쉽다고 생각합니다)은 Git으로 가져온 다음 Git-TF 명령 줄 도구를 사용 하여 TFS로 다시 내보내는 것 입니다.

  • 바이너리, Choclatey 또는 소스 코드에서 Git-TF를 설치합니다.

  • TFS 폴더 복제 :

git tf clone https://myAcc.visualstudio.com/mycollection $/TeamProjectA/Main --deep

  • .Git/tf폴더와 .Git/git-tf파일 을 삭제하여 TFS 서버에서 Git Repo를 연결 해제 합니다.

  • TFS 폴더 에 연결하도록 새 Git Repo를 구성 합니다.

git tf configure https://myAcc.visualstudio.com/mycollection $/TeamProjectB/Main --deep

  • 잊지 마세요 --deep

git tf pull

이 시점에서 "git-tf : 이것은 새로 구성된 저장소입니다. tfs에서 가져올 항목이 없습니다."라는 메시지가 표시됩니다.

git commit -a -m "merge commit"

git tf checkin --deep


Regarding the original command above:-

Get-TfsChildItem $/ProjectA |
select -Skip 1 |  # skip the root dir
foreach {
    tf rename $_.serveritem $_.serveritem.replace("$/ProjectA", "$/ProjectB")
}

Both the source and target names need to be surrounded by quotes in case there are any spaces in the full pathfilename. I found it difficult to do this on $_.ServerItem as surrounding it with escaped " returns that whole child object and not just the .serverItem string. Or if I did manage to get the string, I got unwanted carriage returns such as

"
$proj/folder/file
"

Eventually I got the command to work with the following, but I found that the history still doesn't get transferred, which was the whole point! So I believe this command is the direct equivalent of just using a right mouse click in source explorer and selecting rename (or move).

$tfsServerString = "http://machine:8080/tfs/DefaultCollection"
$tfs = Get-TfsServer $tfsServerString
Get-TfsChildItem -server $tfs "$/Dest Project/MyTestProject" | select -Skip 1 | foreach { $sourceName = $_.serveritem; $targetName = $_.serveritem.replace("$/Dest Project/MyTestProject/", "$/Dest Project/Source/StoreControllers/dSprint/dSprint2/") ; ./tf rename `"$sourceName`" `"$targetName`" /login:myUser }

Also note, it requires use of the backtick ` to escape "

ReferenceURL : https://stackoverflow.com/questions/2215593/team-foundation-server-moving-source-with-history

반응형