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"remotes/p4/master" branch of your git repository. You can use the 40--branch=mybranch option to 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 "remotes/p4/master" 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 66Updating 67======== 68 69A common working pattern is to fetch the latest changes from the Perforce depot 70and merge them with local uncommitted changes. The recommended way is to use 71git's rebase mechanism to preserve linear history. git-p4 provides a convenient 72 73 git-p4 rebase 74 75command that calls git-p4 sync followed by git rebase to rebase the current 76working branch. 77 78Submitting 79========== 80 81git-p4 has support for submitting changes from a git repository back to the 82Perforce depot. This requires a Perforce checkout separate to your git 83repository. To submit all changes that are in the current git branch but not in 84the "p4" branch (or "origin" if "p4" doesn't exist) simply call 85 86 git-p4 submit 87 88in your git repository. If you want to submit changes in a specific branch that 89is not your current git branch you can also pass that as an argument: 90 91 git-p4 submit mytopicbranch 92 93You can override the reference branch with the --origin=mysourcebranch option. 94 95If a submit fails you may have to "p4 resolve" and submit manually. You can 96continue importing the remaining changes with 97 98 git-p4 submit --continue 99 100After submitting you should sync your perforce import branch ("p4" or "origin") 101from Perforce using git-p4's sync command. 102 103If you have changes in your working directory that you haven't committed into 104git yet but that you want to commit to Perforce directly ("quick fixes") then 105you do not have to go through the intermediate step of creating a git commit 106first but you can just call 107 108 git-p4 submit --direct 109 110 111Example 112======= 113 114# Clone a repository 115 git-p4 clone //depot/path/project 116# Enter the newly cloned directory 117 cd project 118# Do some work... 119 vi foo.h 120# ... and commit locally to gi 121 git commit foo.h 122# In the meantime somebody submitted changes to the Perforce depot. Rebase your latest 123# changes against the latest changes in Perforce: 124 git-p4 rebase 125# Submit your locally committed changes back to Perforce 126 git-p4 submit 127# ... and synchronize with Perforce 128 git-p4 rebase 129 130 131Configuration parameters 132======================== 133 134git-p4.user ($P4USER) 135 136Allows you to specify the username to use to connect to the Perforce repository. 137 138 git config [--global] git-p4.user public 139 140git-p4.password ($P4PASS) 141 142Allows you to specify the password to use to connect to the Perforce repository. 143Warning this password will be visible on the command-line invocation of the p4 binary. 144 145 git config [--global] git-p4.password public1234 146 147git-p4.port ($P4PORT) 148 149Specify the port to be used to contact the Perforce server. As this will be passed 150directly to the p4 binary, it may be in the format host:port as well. 151 152 git config [--global] git-p4.port codes.zimbra.com:2666 153 154git-p4.host ($P4HOST) 155 156Specify the host to contact for a Perforce repository. 157 158 git config [--global] git-p4.host perforce.example.com 159 160git-p4.client ($P4CLIENT) 161 162Specify the client name to use 163 164 git config [--global] git-p4.client public-view 165 166git-p4.allowSubmit 167 168 git config [--global] git-p4.allowSubmit false 169 170git-p4.syncFromOrigin 171 172A useful setup may be that you have a periodically updated git repository 173somewhere that contains a complete import of a Perforce project. That git 174repository can be used to clone the working repository from and one would 175import from Perforce directly after cloning using git-p4. If the connection to 176the Perforce server is slow and the working repository hasn't been synced for a 177while it may be desirable to fetch changes from the origin git repository using 178the efficient git protocol. git-p4 supports this setup by calling "git fetch origin" 179by default if there is an origin branch. You can disable this using: 180 181 git config [--global] git-p4.syncFromOrigin false 182 183git-p4.useclientspec 184 185 git config [--global] git-p4.useclientspec false 186 187Implementation Details... 188========================= 189 190* Changesets from Perforce are imported using git fast-import. 191* The import does not require anything from the Perforce client view as it just uses 192 "p4 print //depot/path/file#revision" to get the actual file contents. 193* Every imported changeset has a special [git-p4...] line at the 194 end of the log message that gives information about the corresponding 195 Perforce change number and is also used by git-p4 itself to find out 196 where to continue importing when doing incremental imports. 197 Basically when syncing it extracts the perforce change number of the 198 latest commit in the "p4" branch and uses "p4 changes //depot/path/...@changenum,#head" 199 to find out which changes need to be imported. 200* git-p4 submit uses "git rev-list" to pick the commits between the "p4" branch 201 and the current branch. 202 The commits themselves are applied using git diff/format-patch ... | git apply 203