Trouble importing all perforce branches into git repo

I’m trying to import a project from my company’s Perforce depot into a git repository. I’ve been successful getting a single branch into a single git repo, but what I’d like to do is to pull in the entire project plus all branches, but I can’t get it working correctly.

I have my .p4settings file:

  • Git (Sourcetree) branching and merging - not sure what I did
  • Resources for using Git with RStudio
  • Git clone through a reverse tunnel
  • diff after EGit commit changing whole file, but ok in command line
  • After merge of release branch, why is master 1 commit ahead of develop?
  • GIT - Rebase - How to deal with conflicts
  • P4PORT=perforce-server.local:1666
    P4USER=my.username
    P4CLIENT=my.clientspec.name
    

    Clientspec is fairly simple:

    //project/... //my.clientspec.name/project/...
    -//project/External/... //my.clientspec.name/project/External/...
    

    The second line is to exclude the external library binaries from the checkout.

    I use the following command line to start git-p4 importing:

    git p4 clone --verbose --detect-branches --max-changes=100 //project/...@all
    

    This goes through and checks all the branch names, etc, and attempts to import starting at the first commit (This particular projects begins at changelist 771)

    Importing from //project/...@all into project
    Initialized empty Git repository in /Users/grant/Development/git_test/project/.git/
    Reading pipe: git config git-p4.useclientspec
    Reading pipe: git config git-p4.user
    Reading pipe: git config git-p4.password
    Reading pipe: git config git-p4.port
    Reading pipe: git config git-p4.host
    Reading pipe: git config git-p4.client
    p4 -G branches
    Opening pipe: p4 -G branches
    p4 -G branch -o branch-1
    Opening pipe: p4 -G branch -o branch-1
    Reading pipe: git config --bool core.ignorecase
    p4 -G branch -o branch-2
    ...
    Opening pipe: p4 -G branch -o branch-n
    p4-git branches: []
    initial parents: {}
    

    I’m not sure if p4-git branches, and initial parents are supposed to be empty here, but they are.

    Finally we get to the point where it’s about to start importing changelists into git and the following happens:

    Getting p4 changes for //project/...
    p4 changes //project/...
    Reading pipe: p4 changes //project/...
    p4 -G describe 771
    Opening pipe: p4 -G describe 771
    Importing revision 771 (1%)branch is MAIN
    
        Importing new branch RCMerge/MAIN
    p4 changes //RCMerge/MAIN/...@1,770
    Reading pipe: p4 changes //RCMerge/MAIN/...@1,770
    
        Resuming with change 771
    parent determined through known branches: Branch-foo
    looking for initial parent for refs/remotes/p4/project/MAIN; current parent is refs/remotes/p4/project/Branch-foo
    commit into refs/remotes/p4/project/MAIN
    parent refs/remotes/p4/project/Branch-foo
    p4 -G -x - print
    Opening pipe: p4 -G -x - print
    Glue/source/.empty
    fatal: Invalid ref name or SHA1 expression: refs/remotes/p4/project/Branch-foo
    fast-import: dumping crash report to .git/fast_import_crash_26002
    

    Here’s the file referenced above:

    fast-import crash report:
        fast-import process: 26002
        parent process     : 26000
        at Thu May 19 11:51:54 2011
    
    fatal: Invalid ref name or SHA1 expression: refs/remotes/p4/project/Branch-foo
    
    Most Recent Commands Before Crash
    ---------------------------------
      checkpoint
      commit refs/remotes/p4/project/MAIN
      committer Some User <some.user@domain.com> 1253574589 -0800
      data <<EOT
    * from refs/remotes/p4/project/Branch-foo
    
    Active Branch LRU
    -----------------
        active_branches = 0 cur, 5 max
    
      pos  clock name
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    Inactive Branches
    -----------------
    refs/remotes/p4/project/MAIN:
      status      : dirty
      tip commit  : 0000000000000000000000000000000000000000
      old tree    : 0000000000000000000000000000000000000000
      cur tree    : 0000000000000000000000000000000000000000
      commit clock: 0
      last pack   : 
    
    
    Marks
    -----
    
    -------------------
    END OF CRASH REPORT
    

    Now, being a perforce novice, I have no idea what this means and have no idea how to resolve this issue, or if its even possible. Has anyone run into a similar issue before? If so, how did you resolve it?

  • git-svn - #object# doesn't exist in the repository at /opt/local/libexec/git-core/git-svn line 4706
  • For the Jenkins git plugin, where is it recommended to run `git config`?
  • How do I tell fugitive my path to Git on Windows?
  • How to import packages between themselves under one repository in golang?
  • Android studio and git
  • What is the difference between local repository and index?
  • One Solution collect form web for “Trouble importing all perforce branches into git repo”

    I’ve finally figured out the solution to this problem. It turns out that a Perforce branch mapping was done in reverse and that was the source of this problem.

    Branch-foo was branched off of MAIN, which should have a branch mapping like so:

    //project/MAIN/... //project/Branch-foo/...
    

    However, the person who created the branch, reversed the mapping, thus resulting in this:

    //project/Branch-foo/... //project/MAIN/...
    

    This confused git-p4 as MAIN had the first changelists starting at #771 and Branch-foo had changelists starting at #7652, thus it couldn’t find any parent in Branch-foo and crashed. Changing the branch spec to the first one listed above fixed the probblem.

    Git Baby is a git and github fan, let's start git clone.