contrib / fast-import / git-p4.txton commit Fix branch detection in multi-branch imports (af8da89)
   1git-p4 - Perforce <-> Git converter using git-fast-import
   2
   3Usage
   4=====
   5
   6git-p4 supports two main modes: Importing from Perforce to a Git repository is
   7done using "git-p4 sync" or "git-p4 rebase". Submitting changes from Git back
   8to Perforce is done using "git-p4 submit".
   9
  10Importing
  11=========
  12
  13You can simply start with
  14
  15  git-p4 clone //depot/path/project
  16
  17or
  18
  19  git-p4 clone //depot/path/project myproject
  20
  21This will create an empty git repository in a subdirectory called "project" (or
  22"myproject" with the second command), import the head revision from the
  23specified perforce path into a git "p4" branch (remotes/p4 actually), create a
  24master branch off it and check it out. If you want the entire history (not just
  25the head revision) then you can simply append a "@all" to the depot path:
  26
  27  git-p4 clone //depot/project/main@all myproject
  28
  29
  30
  31If you want more control you can also use the git-p4 sync command directly:
  32
  33  mkdir repo-git
  34  cd repo-git
  35  git init
  36  git-p4 sync //path/in/your/perforce/depot
  37
  38This will import the current head revision of the specified depot path into a
  39"p4" branch of your git repository. You can use the --branch=mybranch option
  40to use a different branch.
  41
  42If you want to import the entire history of a given depot path just use
  43
  44  git-p4 sync //path/in/depot@all
  45
  46To achieve optimal compression you may want to run 'git repack -a -d -f' after
  47a big import. This may take a while.
  48
  49Support for Perforce integrations is still work in progress. Don't bother
  50trying it unless you want to hack on it :)
  51
  52Incremental Imports
  53===================
  54
  55After an initial import you can easily synchronize your git repository with
  56newer changes from the Perforce depot by just calling
  57
  58  git-p4 sync
  59
  60in your git repository. By default the "p4" branch is updated.
  61
  62It is recommended to run 'git repack -a -d -f' from time to time when using
  63incremental imports to optimally combine the individual git packs that each
  64incremental import creates through the use of git-fast-import.
  65
  66
  67A useful setup may be that you have a periodically updated git repository
  68somewhere that contains a complete import of a Perforce project. That git
  69repository can be used to clone the working repository from and one would
  70import from Perforce directly after cloning using git-p4. If the connection to
  71the Perforce server is slow and the working repository hasn't been synced for a
  72while it may be desirable to fetch changes from the origin git repository using
  73the efficient git protocol. git-p4 supports this through
  74
  75  git-p4 sync --with-origin
  76
  77or
  78
  79  git-p4 rebase --with-origin
  80
  81In that case "git fetch origin" is called and if it turns out that the origin
  82branch is newer than the git "p4" import branch then the latter is updated from
  83the former and the direct import from Perforce is resumed, which will result in
  84fewer changes to be imported using the slower perforce connection.
  85
  86Updating
  87========
  88
  89A common working pattern is to fetch the latest changes from the Perforce depot
  90and merge them with local uncommitted changes. The recommended way is to use
  91git's rebase mechanism to preserve linear history. git-p4 provides a convenient
  92
  93  git-p4 rebase
  94
  95command that calls git-p4 sync followed by git rebase to rebase the current
  96working branch.
  97
  98Submitting
  99==========
 100
 101git-p4 has support for submitting changes from a git repository back to the
 102Perforce depot. This requires a Perforce checkout separate to your git
 103repository. To submit all changes that are in the current git branch but not in
 104the "p4" branch (or "origin" if "p4" doesn't exist) simply call
 105
 106    git-p4 submit
 107
 108in your git repository. If you want to submit changes in a specific branch that
 109is not your current git branch you can also pass that as an argument:
 110
 111    git-p4 submit mytopicbranch
 112
 113You can override the reference branch with the --origin=mysourcebranch option.
 114
 115If a submit fails you may have to "p4 resolve" and submit manually. You can
 116continue importing the remaining changes with
 117
 118  git-p4 submit --continue
 119
 120After submitting you should sync your perforce import branch ("p4" or "origin")
 121from Perforce using git-p4's sync command.
 122
 123
 124Example
 125=======
 126
 127# Clone a repository
 128  git-p4 clone //depot/path/project
 129# Enter the newly cloned directory
 130  cd project
 131# Do some work...
 132  vi foo.h
 133# ... and commit locally to gi
 134  git commit foo.h
 135# In the meantime somebody submitted changes to the Perforce depot. Rebase your latest
 136# changes against the latest changes in Perforce:
 137  git-p4 rebase
 138# Submit your locally committed changes back to Perforce
 139  git-p4 submit
 140# ... and synchronize with Perforce
 141  git-p4 rebase
 142
 143
 144Implementation Details...
 145=========================
 146
 147* Changesets from Perforce are imported using git fast-import.
 148* The import does not require anything from the Perforce client view as it just uses
 149  "p4 print //depot/path/file#revision" to get the actual file contents.
 150* Every imported changeset has a special [git-p4...] line at the
 151  end of the log message that gives information about the corresponding
 152  Perforce change number and is also used by git-p4 itself to find out
 153  where to continue importing when doing incremental imports.
 154  Basically when syncing it extracts the perforce change number of the
 155  latest commit in the "p4" branch and uses "p4 changes //depot/path/...@changenum,#head"
 156  to find out which changes need to be imported.
 157* git-p4 submit uses "git rev-list" to pick the commits between the "p4" branch
 158  and the current branch.
 159  The commits themselves are applied using git diff-tree ... | patch -p1
 160