contrib / fast-import / git-p4.txton commit Merge branch 'maint' (f574cb3)
   1git-p4 - Perforce <-> Git converter using git-fast-import
   2
   3Usage
   4=====
   5
   6git-p4 can be used in two different ways:
   7
   81) To import changes from Perforce to a Git repository, using "git-p4 sync".
   9
  102) To submit changes from Git back to Perforce, using "git-p4 submit".
  11
  12Importing
  13=========
  14
  15Simply start with
  16
  17  git-p4 clone //depot/path/project
  18
  19or
  20
  21  git-p4 clone //depot/path/project myproject
  22
  23This will:
  24
  251) Create an empty git repository in a subdirectory called "project" (or
  26"myproject" with the second command)
  27
  282) Import the head revision from the given Perforce path into a git branch
  29called "p4" (remotes/p4 actually)
  30
  313) Create a master branch based on it and check it out.
  32
  33If you want the entire history (not just the head revision) then you can simply
  34append a "@all" to the depot path:
  35
  36  git-p4 clone //depot/project/main@all myproject
  37
  38
  39
  40If you want more control you can also use the git-p4 sync command directly:
  41
  42  mkdir repo-git
  43  cd repo-git
  44  git init
  45  git-p4 sync //path/in/your/perforce/depot
  46
  47This will import the current head revision of the specified depot path into a
  48"remotes/p4/master" branch of your git repository. You can use the
  49--branch=mybranch option to import into a different branch.
  50
  51If you want to import the entire history of a given depot path simply use:
  52
  53  git-p4 sync //path/in/depot@all
  54
  55
  56Note:
  57
  58To achieve optimal compression you may want to run 'git repack -a -d -f' after
  59a big import. This may take a while.
  60
  61Incremental Imports
  62===================
  63
  64After an initial import you can continue to synchronize your git repository
  65with newer changes from the Perforce depot by just calling
  66
  67  git-p4 sync
  68
  69in your git repository. By default the "remotes/p4/master" branch is updated.
  70
  71Advanced Setup
  72==============
  73
  74Suppose you have a periodically updated git repository somewhere, containing a
  75complete import of a Perforce project. This repository can be cloned and used
  76with git-p4. When updating the cloned repository with the "sync" command,
  77git-p4 will try to fetch changes from the original repository first. The git
  78protocol used with this is usually faster than importing from Perforce
  79directly.
  80
  81This behaviour can be disabled by setting the "git-p4.syncFromOrigin" git
  82configuration variable to "false".
  83
  84Updating
  85========
  86
  87A common working pattern is to fetch the latest changes from the Perforce depot
  88and merge them with local uncommitted changes. The recommended way is to use
  89git's rebase mechanism to preserve linear history. git-p4 provides a convenient
  90
  91  git-p4 rebase
  92
  93command that calls git-p4 sync followed by git rebase to rebase the current
  94working branch.
  95
  96Submitting
  97==========
  98
  99git-p4 has support for submitting changes from a git repository back to the
 100Perforce depot. This requires a Perforce checkout separate from your git
 101repository. To submit all changes that are in the current git branch but not in
 102the "p4" branch (or "origin" if "p4" doesn't exist) simply call
 103
 104    git-p4 submit
 105
 106in your git repository. If you want to submit changes in a specific branch that
 107is not your current git branch you can also pass that as an argument:
 108
 109    git-p4 submit mytopicbranch
 110
 111You can override the reference branch with the --origin=mysourcebranch option.
 112
 113If a submit fails you may have to "p4 resolve" and submit manually. You can
 114continue importing the remaining changes with
 115
 116  git-p4 submit --continue
 117
 118Example
 119=======
 120
 121# Clone a repository
 122  git-p4 clone //depot/path/project
 123# Enter the newly cloned directory
 124  cd project
 125# Do some work...
 126  vi foo.h
 127# ... and commit locally to gi
 128  git commit foo.h
 129# In the meantime somebody submitted changes to the Perforce depot. Rebase your latest
 130# changes against the latest changes in Perforce:
 131  git-p4 rebase
 132# Submit your locally committed changes back to Perforce
 133  git-p4 submit
 134# ... and synchronize with Perforce
 135  git-p4 rebase
 136
 137
 138Configuration parameters
 139========================
 140
 141git-p4.user ($P4USER)
 142
 143Allows you to specify the username to use to connect to the Perforce repository.
 144
 145  git config [--global] git-p4.user public
 146
 147git-p4.password ($P4PASS)
 148
 149Allows you to specify the password to use to connect to the Perforce repository.
 150Warning this password will be visible on the command-line invocation of the p4 binary.
 151
 152  git config [--global] git-p4.password public1234
 153
 154git-p4.port ($P4PORT)
 155
 156Specify the port to be used to contact the Perforce server. As this will be passed
 157directly to the p4 binary, it may be in the format host:port as well.
 158
 159  git config [--global] git-p4.port codes.zimbra.com:2666
 160
 161git-p4.host ($P4HOST)
 162
 163Specify the host to contact for a Perforce repository.
 164
 165  git config [--global] git-p4.host perforce.example.com
 166
 167git-p4.client ($P4CLIENT)
 168
 169Specify the client name to use
 170
 171  git config [--global] git-p4.client public-view
 172
 173git-p4.allowSubmit
 174
 175  git config [--global] git-p4.allowSubmit false
 176
 177git-p4.syncFromOrigin
 178
 179A useful setup may be that you have a periodically updated git repository
 180somewhere that contains a complete import of a Perforce project. That git
 181repository can be used to clone the working repository from and one would
 182import from Perforce directly after cloning using git-p4. If the connection to
 183the Perforce server is slow and the working repository hasn't been synced for a
 184while it may be desirable to fetch changes from the origin git repository using
 185the efficient git protocol. git-p4 supports this setup by calling "git fetch origin"
 186by default if there is an origin branch. You can disable this using:
 187
 188  git config [--global] git-p4.syncFromOrigin false
 189
 190git-p4.useclientspec
 191
 192  git config [--global] git-p4.useclientspec false
 193
 194The P4CLIENT environment variable should be correctly set for p4 to be
 195able to find the relevant client.  This client spec will be used to
 196both filter the files cloned by git and set the directory layout as
 197specified in the client (this implies --keep-path style semantics).
 198
 199Implementation Details...
 200=========================
 201
 202* Changesets from Perforce are imported using git fast-import.
 203* The import does not require anything from the Perforce client view as it just uses
 204  "p4 print //depot/path/file#revision" to get the actual file contents.
 205* Every imported changeset has a special [git-p4...] line at the
 206  end of the log message that gives information about the corresponding
 207  Perforce change number and is also used by git-p4 itself to find out
 208  where to continue importing when doing incremental imports.
 209  Basically when syncing it extracts the perforce change number of the
 210  latest commit in the "p4" branch and uses "p4 changes //depot/path/...@changenum,#head"
 211  to find out which changes need to be imported.
 212* git-p4 submit uses "git rev-list" to pick the commits between the "p4" branch
 213  and the current branch.
 214  The commits themselves are applied using git diff/format-patch ... | git apply
 215