Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tfs 使用SoundFoundation服务器实际使用MyMalic?_Tfs_Mercurial - Fatal编程技术网

Tfs 使用SoundFoundation服务器实际使用MyMalic?

Tfs 使用SoundFoundation服务器实际使用MyMalic?,tfs,mercurial,Tfs,Mercurial,My shop使用TFS&除了缺少本地存储库提交/恢复之外,一般都对它感到满意。我开始在本地使用Mercurial来帮助管理较小的更改块,然后将它们发布到TFS。我看到Subversion有一个“桥接”组件,如果中央VCS是Subversion,它可以自动启用此功能。我还没有找到一个团队系统。这鼓励了我,其他人已经走上了将DVCS与CVCS系统集成的道路 (1) 有人知道吗?我有点怀疑(快速搜索没有找到任何东西) (2) 有人以这种方式使用Mercurial/TFS吗?如果有,请分享您的经验。我

My shop使用TFS&除了缺少本地存储库提交/恢复之外,一般都对它感到满意。我开始在本地使用Mercurial来帮助管理较小的更改块,然后将它们发布到TFS。我看到Subversion有一个“桥接”组件,如果中央VCS是Subversion,它可以自动启用此功能。我还没有找到一个团队系统。这鼓励了我,其他人已经走上了将DVCS与CVCS系统集成的道路

(1) 有人知道吗?我有点怀疑(快速搜索没有找到任何东西)

(2) 有人以这种方式使用Mercurial/TFS吗?如果有,请分享您的经验。我特别想了解在通过Mercurial进行重大活动后,对于TFS的承诺可能会出现哪些不明显的问题


到目前为止,只有我使用if几天,这似乎是一个双赢的局面——但我当时知道的足够多,认为这很容易。

我知道有些人将hgsubversion与Subversion桥一起使用。我不知道它工作得有多好,而且我从未使用过TFS


据我所知,没有比使用TFS->Subversion bridge->hgsubversion更“本地”的网桥了,但我也听说它工作得相当好。我对TFS的理解非常有限,这表明它的内部模型应该足够类似于Subversion,以便像hgsubversion这样的东西能够很好地工作。

不确定这是否是您还不知道的,但我已经在本地使用mercurial有一段时间了,到目前为止,我认为管理这两个源代码控制系统所带来的好处超过了额外的开销。以下是我一直在做的事情:

我让我的TFS签出了一个我认为是我的“大师”的知识库。我从TFS获取更新并将其提交到此repo,因此这包含TFS中项目的最新状态。这里重要的一点是,没有任何独立于TFS更新或Hg合并(这是第2部分)的更改

  • 任何时候我需要改变,我都会克隆我的“主”回购协议并在那里工作。我发现每个功能或故事的克隆实际上非常容易管理,而且感觉非常干净。一旦我完成了一项功能,我会将Hg合并回“主”repo,它已经应用了所有TFS更新。这使我能够使用Mercurial的合并功能,这些功能远远优于TFS,从而引发了人们对TFS如何声称合并代码的质疑。合并完成后,我在Hg中提交它,然后将这些更改检查到TFS中。最好的一点是,当我签入TFS时,我不必合并任何内容。非常非常好

  • 现在,我发现这种方法存在以下问题:

  • 最大的问题是TFS在发现变化方面表现不佳。有一个插件,当Mercurial更新/合并修改后的文件时,您可以使用该插件使其可写。我发现有两种选择。您可以强制TFS脱机,此时它将假定需要签入任何可写的文件,也可以使用源代码管理工具中的比较工具,选择更改的文件并单独签出它们。在我看来,两者都很差劲

  • 即使您将TFS源代码管理文件从hg存储库中排除(您应该这样做),源代码管理绑定仍然存在于项目级别。在您将文件添加到解决方案中之前,这一点并不明显,此时它会尝试将其添加到源代码管理中。您可以“撤消挂起的更改”并删除源代码管理添加,但这真的很烦人

  • 好消息是,我使用这种方法进行了一次大规模的合并,如果我被迫使用TFS工具,我认为这会导致我转向某种形式的硬药

    我还没有将此应用于更新TFS中的分支,但我的猜测是,这将比您在TFS中提供的合并选项要好得多。另一方面,由于您可以一次签入工作功能块,因此使用TFS合并的问题会少一些,因为特性所需的所有更改都将集中在一个地方

    我没有尝试解决的一件事是在整个团队中分享这一点。部分原因是,这真的不必是整个团队的事情。我在远程工作,因此拥有一个本地存储库是一件大事,可以节省很多时间。我的开发团队的其他成员可能会也可能不会从这种方法中获得同样的好处,但我发现我可以在不影响他们工作方式的情况下获得同样的好处,这很酷

    更新 一段时间以来,我一直希望根据评论和我使用大型TFS存储库的一些经验,使用其他信息更新此响应

    首先,正如@在评论中指出的,您可以利用更好地将工作存储库中的提交集成到主TFS存储库中。不过,根据您希望提交显示给TFS的方式,您可能希望使用将更改压缩为单个提交(这可以使TFS中的回滚更容易)。还有一个“在线”命令,通过它可以让TFS更容易地知道发生了什么变化(再次感谢Eric在他的报告中提到这一点)

    现在,当我最初写这篇文章时,我正在从事一个项目,该项目只有一个开发人员使用的TFS分支,而且相当小,所以克隆存储库并没有什么大不了的。后来,我发现自己在一个项目中工作,该项目在签出后的回购容量约为1.5GB,在构建后的回购容量要大得多,并且经常需要在TFS中的分支之间切换。显然,这种方法不太适合这种环境(特别是因为在某一点上,不可能在任意目录中构建解决方案)

    尺寸问题最好解决
    =====FILE: push.ps1=====
    $projName = "TicTacToeCMMI"
    $tftp = "C:\Program Files\Microsoft Team Foundation Server 2010 Power Tools\TFPT.exe"
    $tf = "C:\Program Files\Microsoft Visual Studio 10.0\Common7\ide\tf.exe"
    
    hg push
    cd ..\$projName-tfs  
    "Syncing -tfs workspace with TFS server"  
    &$tftp scorch /noprompt /exclude:.hg',_Resharper*',*.user  
    "Making all files in -tfs writable"
    attrib -R /S /D *
    "Updating -tfs with latest push from Mercurial"
    hg update -C -y
    attrib +R /S /D *
    attrib -R /S /D .hg\*
    "Resyncing Mercurial changes with TFS Server"  
    &$tftp online /adds /deletes /diff /exclude:'.hgignore,.hg,bin,obj,*.ps1,_Resharper*,*.lnk,*.user,*.suo,*.vspscc'  
    "Checkin"  
    &$tf checkin  
    cd ..\$projName-working  
    cmd /c pause  
    
    ====FILE: pull.ps1=====
    $projName = "TicTacToeCMMI"
    $tf = "C:\Program Files\Microsoft Visual Studio 10.0\Common7\ide\tf.exe"
    $username = cmd /c set USERNAME
    $username = $username.SubString($username.IndexOf("=")+1)
    
    function pull {
        cd ..\$projName-tfs
        &$tf get
        hg commit -A -m "from tfs" --user $username
        cd ..\$projName-working
        hg pull --rebase
    }
    pull  
    cmd /c pause  
    
    TARGET: C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe C:\dev\TicTacToeCMMI-working\push.ps1
    START IN: C:\dev\TicTacToeCMMI-working
    
    param([parameter(Position=0, Mandatory=$true)][string] $action)
    
    $HGDirectory = Get-Location
    $TfsDirectory = @(hg paths | where-object { $_.StartsWith("default = ") })[0].SubString(10)
    
    # Pull from TFS
    function pull
    {
        # Todo pull changes one by one brining who did it and the comment into HG
        # tf history . /recursive /format:brief /noprompt /version:300~1000 /sort:ascending
        # tf properties . /recursive
    
        # Add the changes from TFS into the TFS HG repository
        Set-Location $TfsDirectory
        tf get . /recursive
        hg commit -A -m "Update from TFS"  
    
        # Pull / merge the changes from TFS's HG repository
        Set-Location $HGDirectory
        hg pull
        hg merge --tool internal:fail
        hg commit -m "Merged from TFS"
    
        ""
        "The you have the following conflicts which need resolving"
        hg resolve -l | write-host -foregroundcolor "red"
        #thg commit
    }
    
    # Push to TFS
    function push 
    {
        Set-Location $HGDirectory
        hg push
        Set-Location $TfsDirectory
    
        $FilesModified = @()
        $FilesRenamed = @{} # Key: old file name .... Val: new file name
        $FilesRemoved = @()
        $FilesAdded = @()
    
        # Work out what changes have taken place
        "Calculating the changes which have been made in HG..."
        tfpt scorch /exclude:.hg,*.user | out-null
        $AllChanges = hg status --rev .:tip -A 
        for($i = 0; $i -lt $AllChanges.length ; $i++)
        {
            $type = $AllChanges[$i].SubString(0, 2)
            $fileName = $AllChanges[$i].SubString(2)
    
            switch($type)
            {
                "M " # Modified files  
                    { 
                        $FilesModified += $fileName
                    } 
    
                "A " # New Files
                    {  
                        $nextType = $null
                        $nextFileName = $null
                        if($AllChanges.length -gt ($i+1))
                        {
                            $nextType = $AllChanges[$i+1].SubString(0, 2)
                            $nextFileName = $AllChanges[$i+1].SubString(2)                
                        }
    
                        if($nextType -eq "  ")
                        {
                            # we have a rename
                            $FilesRenamed[$nextFileName]=$fileName
                            $i++
                        }
                        else
                        {
                            # we're adding the file
                            $FilesAdded += $fileName
                        }
                     }
    
                "R " # Removed
                    {
                        if($FilesRenamed.ContainsKey($fileName))
                        {
                            continue
                        }
    
                        $FilesRemoved += $fileName
                    }
    
                "C " # Same 
                    { 
                        continue 
                    }
    
                default 
                    { 
                        "Unknown HG status line: "+$AllChanges[$i] 
                        return -1
                    }
            }
        }
    
        # perform the TFS operations 
        "Renaming files in TFS..."
        foreach($file in $FilesRenamed.Keys) {   
            tf checkout $file | out-null
            tf rename $file $FilesRenamed[$file] | out-null
        }
    
        "Checking out for edit in TFS..."
        foreach($file in $FilesModified) { tf checkout $file | out-null }
    
        "Removing files from TFS..."
        foreach($file in $FilesRemoved) { tf delete $file | out-null }
    
        # perform the Mercural update
        "Pulling changes out of HG...."
        hg update --rev .:tip --clean
    
        # perform any POST TFS operations
        "Adding new files to TFS..."
        foreach($file in $FilesAdded) { tf add $file }
    
        "Cleaning up..."
        tfpt uu /noget
        tf checkin
    }
    
    
    if ($action -eq "push") { push }
    elseif ($action -eq "pull") { pull }
    else { "Unknown action ... please supply 'push' or 'pull'" }
    
    # return to our starting point
    Set-Location $HGDirectory