How do I use git-tfs and idiomatic git branching against a TFS repository?

前端 未结 3 746
天涯浪人
天涯浪人 2020-12-07 16:27

How Do I Use git-tfs Idiomatically?

  • The git idiom is to check out branches to the root directory of the repository. Checking out a branch will re

相关标签:
3条回答
  • 2020-12-07 16:59

    What about multiple remote tfs-repos, 1 per branch? i have the following structure:

    $/Root/Main/someproject (the trunk)
    $/Root/Releases/Branch1/someproject
    $/Root/Releases/Branch2/someproject
    

    what i did

    git tfs quick-clone http://tfs:8080/tfs/defaultcollection $/Root/Trunk GitRepo
    git tfs quick-clone http://tfs:8080/tfs/defaultcollection $/Root/Releases/Branch1 GitRepo -i 
        branch1
    git tfs quick-clone http://tfs:8080/tfs/defaultcollection $/Root/Releases/Branch2 GitRepo -i branch2
    

    then you can create a branch for each remote branch: git checkout -b localbranch1 tfs/Branch1 and commit into the tfs branch git tfs ct -i branch1

    In order to be able to easily merge the two lines create a graft:

    echo branch-commit-id trunk-parent-id > .git/infos/grafts
    

    where the ids are the hash of the first branch commit (from the Releases repo) and a parent commit id (find manually)

    PS: I get error: Specified git repository directory is not empty as well (don't know how it worked before), so I manually added the second url in .git/config and did git tfs fetch -i Branch1

    0 讨论(0)
  • 2020-12-07 17:04

    It's now possible to get the TFS branches to be correct Git branches if cloning using git-tfs. This is now in the stable release! You first clone not the entire repository but the trunk :

    git tfs clone http://<tfsurl>:8080 $/main/trunk
    

    Then you run branch --init, which creates a new branch in the Git repository

    git tfs branch --init $/MyProject/MyTFSBranch
    

    in your case :

    git tfs branch --init $/main/feature-logon
    

    Or use the the --all flag on a fresh cloned repository to create ALL the branches present on the TFS server.

    git tfs branch --init --all
    

    You could also clone directly with all the branches using flag --with-branches:

    git tfs clone http://<tfsurl>:8080 $/main/trunk --with-branches
    

    The documentation for this new command is here. Feel free to provide feedback to improve it...

    0 讨论(0)
  • 2020-12-07 17:25

    Here's one way you can do this, and still maintain some relationships between master and the branches. You'd probably want to script it. Excuse me if I use bash statements rather than windows command line for some of my examples

    First clone the whole repository out, as in your first example, with branches as directories.

    This moves the trunk to the root. (hopefully there are no conflicts with your branch folders)

    mv trunk/*.* .
    

    Commit your new master

    git commit -a -m "refactoring master"
    

    creating a new branch

    git checkout -b feature-login
    

    Copy the branch files over the root files

    mv feature-login/*.* .
    

    Don't need these here any longer

    rm -rf [all_branch_directories]
    

    Commit the branch

    git commit -a -m "refactoring feature-login"
    

    back to master

    git checkout master
    

    Do it all again

    git checkout -b next_branch
    

    etc. etc..

    Finally at the end

    git checkout master
    rm -rf [all_branch_directories]
    git commit -a -m "refactoring master"
    

    It's not perfect, but you end up with all your branches cloned off master and diffed more or less appropriately. AFAIK git should be fine if you overwrite a file with another file but the contents don't change, which allows this to all work.

    One downside is that you won't clear out any files in the branches that have been deleted from the trunk. This may or may not be an issue for you...

    0 讨论(0)
提交回复
热议问题