<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<META NAME="GENERATOR" CONTENT="Mozilla/4.05 [en] (X11; U; OSF1 V4.0 alpha) [Netscape]">
<TITLE>Basic Perforce FAQ</TITLE>
<x-html>
</HEAD>
<BODY>
<H1>
Basic Perforce FAQ</H1>
<H3>
Note - the intended audience for this FAQ is a person using Perforce for
software development. There's a separate <A HREF="admin.html">FAQ for system
administrators</A>, and eventually we'll have one for advanced Perforce
users.</H3>
<I>This FAQ assumes that there is a Perforce Administrator who knows some
of the more complex parts of Perforce, who can provide help, counseling,
and deal with policy-specific issues. This FAQ is taken from an initial
set of questions provided by
<A HREF="rmg@netapp.com">Richard Geiger</A>
and <A HREF="mailto:jab@pobox.com">Jeff Bowles</A>.</I>
<BR>
<OL>
<H4>
<B>Initial List</B></H4>
<LI>
<A HREF="#begin...">Where do I begin?</A></LI>
<LI>
<A HREF="#What is S.C.M.">What is S.C.M.?</A></LI>
<H4>
Getting and modifying files</H4>
<LI>
<A HREF="#check out a source...">How do I check out a source tree?</A></LI>
<LI>
<A HREF="#make a change to a file and...">How do I make a change to a file
and check it in?</A></LI>
<LI>
<A HREF="#change $EDITOR...">What if I have a favorite editor and want
to use it when I do a change submission?</A></LI>
<LI>
<A HREF="#add a new...">How do I add a new directory?</A></LI>
<LI>
<A HREF="#remove a...">How do I remove a directory?</A></LI>
<LI>
<A HREF="#check out some older version...">How do I check out some older
version of a file?</A></LI>
<LI>
<A HREF="#check out an entire tree as of...">How do I check out an entire
tree as of some date?</A></LI>
<LI>
<A HREF="#check out an entire tree...">How do I check out an entire tree
corresponding to some build or release?</A></LI>
<H4>
Comparing what you've gotten to the reference copy</H4>
<LI>
<A HREF="#compare a working file to the...">How do I compare a working
file to the base?</A></LI>
<LI>
<A HREF="#compare a whole tree to the...">How do I compare a whole tree
to the base?</A></LI>
<LI>
<A HREF="#get my favorite diff behaviors...">How do I get my favorite diff
behaviors with p4 diff?</A></LI>
<LI>
<A HREF="#update a tree from the...">How do I update a tree from the base?</A></LI>
<LI>
<A HREF="#compare a working file to an...">How do I compare a working file
to an older version (other than the base)?</A></LI>
<H4>
Getting information about a file or workspace</H4>
<LI>
<A HREF="#get a list of all files I have...">How do I get a list of all
files I have open on all my client workspaces?</A></LI>
<LI>
<A HREF="#examine the change log for a...">How do I examine the change
log for a file?</A></LI>
<H4>
Abandoning work and starting over</H4>
<LI>
<A HREF="#abandon my changes and pick up...">How do I abandon my changes
and pick up a clean copy from the base?</A></LI>
<LI>
<A HREF="#propagate an individual change...">How do I propagate an individual
change made in one branch to another?</A></LI>
<LI>
<A HREF="#deleting weird file">I created a file that begins with a dash, and
want to 'p4 delete' it and cannot. What can I do?</A></LI>
<H4>
Changing your workspace (moving it, deleting it)</H4>
<LI>
<A HREF="#delete a client...">How do I delete a client workspace?</A></LI>
<LI>
<A HREF="#move a client...">How do I move a client workspace?</A></LI>
<h4>Miscellaneous problems</h4>
<LI>
<A HREF="#I can't sync...">I can't "p4 sync" a particular file. What might be going on?</li>
</OL>
<OL>
<HR>
<LI>
<A NAME="begin..."></A><B>Where do I begin?</B></LI>
<BR>Start with <A HREF="http://perforce.com/perforce/doc.982/cmdguide/quickstart.html">chapters
#3-5 of the user's guide</A> - that's referred to as the <I>Quick Start</I>
to the product. <A HREF="http://perforce.com/perforce/technical/">All</A>
of the documentation is on-line.
<P>It's probably best to create a small workspace (the term is "client")
to play in, so that you can experiment with a few files and not necessarily
the 16,000 files that you're planning to manage with source control.
<BR> <HR>
<LI>
<A NAME="What is S.C.M."></A><B>What is S.C.M.?</B></LI>
<BR>Short answer: it's a way to maintain revisions of files so that you
can easily recreate a version of a file from any moment in time.
<P>The "S.C.M." translates to "Source Code Management" or perhaps "Software
Code Management" or "Software Control Management" - the better systems
let you manage large sets of files, have multiple people working with the
same body of files (a development team of 1 person isn't much fun),
and work on different platforms (such as Windows/NT and Unix) transparently.
<P>There are a lot of S.C.M. products around - this FAQ won't try to spend
a lot of time enumerating them or contrasting them.
<HR>
<LI>
<A NAME="check out a source..."></A><B>How do I check out a source tree?</B></LI>
<BR>
<BR>Another way to phrase the question is "How do I get files and begin
editing them?". This question will answer the first part of the question
- the next FAQ will answer the rest.
<BR>
<H5>
To get a set of files...</H5>
Each of the following cases assumes you have a "Perforce client" (a.k.a.
'workspace') already. If not, see the FAQ to create one.
<BR>
<BR><I>Case #1: you need to get all the files - the most recent revision
of each file.</I>
<BR>
<UL>Type
<P><TT><FONT COLOR="#990000">
p4 sync</FONT></TT>
<P>That will get you a read-only copy of the "head "revision of every file
that your client can see.</UL>
<I>Case #2: You need to get the files in a specific directory - the most
recent revision of each file.</I>
<BR>
<UL>You'll want to "cd" (chdir) to the directory you want to get.
Then type p4 sync ... to get the files that should go into that directory.
For example:
<P><TT><FONT COLOR="#990000">
cd <I>directoryname</I><BR>
p4 sync ...</FONT></TT>
<P>That will get you a read-only copy of the "head "revision of every file
<I>in that directory and its subdirectories </I>that your client can see.</UL>
<I>Case #3: You need to get the files from some `label' someone made for
you.</I>
<BR>
<UL>If the label name is "BUILD_28", you'll be updating your client (a.k.a.
workspace) the "the revision of each file that is included in label 'BUILD_28'."
Note that this means that your local copy of files not included in 'BUILD_28'
are removed.
<P>Some examples:
<BR>
<OL>
<OL>
<CENTER><TABLE BORDER WIDTH="80%" NOSAVE >
<TR>
<TD><TT><FONT COLOR="#990000">p4 sync @BUILD_28</FONT></TT></TD>
<TD>Update the local copies of files on the current client to be the exact
revision specified in label "BUILD_28". The local copy of files not
included in the label, but managed by Perforce, are removed from the client.</TD>
</TR>
<TR NOSAVE>
<TD><TT><FONT COLOR="#990000">cd <I>directoryname</I></FONT></TT>
<BR><TT><FONT COLOR="#990000">p4 sync ...@BUILD_28</FONT></TT></TD>
<TD NOSAVE>Update the local copies of files <I>in directoryname (and underneath
that tree)</I> on the current client to be the exact revision specified
in label "BUILD_28".
<P>The local copy <I>in directoryname (and underneath that tree) </I>of
files not included in the label, but managed by Perforce, are removed from
the client. Files not under <I>directoryname</I> aren't touched.</TD>
</TR>
<TR>
<TD><TT><FONT COLOR="#990000">p4 sync <I>directoryname</I>/...@BUILD_28</FONT></TT></TD>
<TD>Should do exactly the same thing as the previous example. (Neat, huh?)</TD>
</TR>
<CAPTION ALIGN=BOTTOM> </CAPTION>
</TABLE></CENTER>
</OL>
</OL>
</UL>
<BR> <HR>
<LI>
<A NAME="make a change to a file and..."></A><B>How do I make a change
to a file and check it in?</B></LI>
<BR>
<H5>
To edit a set of files...</H5>
Normally, you will edit a file using three steps:
<UL>
<LI>
Open the file for the 'edit' operation - you can open more than one file
at a time;</LI>
<LI>
Do the editing in your favorite editor, and make the contents of the files
into what you want.</LI>
<LI>
Submit the modifications as one 'atomic' change so that they're available
to other people.</LI>
</UL>
<H5>
Step #1:</H5>
<UL>The basic edit command is
<BR>
<BR> <TT><FONT COLOR="#990000"> p4 edit
<I>filename</I></FONT></TT>
<BR>
<BR>or,
<BR>
<BR><TT><FONT COLOR="#990000"> p4 edit
<I>filename1 filename2 </I> </FONT></TT><I>(and
so on)</I>
<BR>
<BR>and occasionally,
<BR>
<BR><TT><FONT COLOR="#990000"> p4 edit
<I>directoryname</I>/... </FONT></TT><I>(edit
all files in `directoryname' and its subdirectories)</I>
<BR> </UL>
<H5>
Step #2:</H5>
<UL>Do the editing using your favorite editor - Perforce isn't directly
involved in this step. You can always run through "Step #1" on other
files, if you decide you need to edit more files.
<P><I>In Perforce, the 'working' copy of the file is a local copy stored
in the "client area". The modified contents are sent back to the server
only when you do a 'p4 submit'.</I></UL>
<H5>
Step #3:</H5>
<UL>The basic "submit my changes" command is:
<BR>
<BR><TT><FONT COLOR="#990000"> p4 submit
</FONT><I><FONT COLOR="#000000">(submit all modifications)</FONT></I></TT>
<BR>
<BR>or, occasionally,
<BR>
<BR><TT><FONT COLOR="#990000"> p4 submit
<I>filename </I></FONT></TT><I>(submit only this one
file's modifications, leave the rest checked out)</I>
<P><B>When you run...</B>
<BR>
<BR><B><TT><FONT COLOR="#990000"> p4 submit</FONT></TT></B>
<BR>
<BR><B>...you'll be dumped into the editor, to write a description of why
you made these changes. </B>See the manual for more details.
<BR> </UL>
<HR>
<LI>
<A NAME="change $EDITOR..."></A><B>What if I have a favorite editor and
want to use it when I do a change submission?</B></LI>
<BR>
<BR>You can either set the environment variable "P4EDITOR" to be the name
of the editor you want to run, or if you're on Windows/NT, use: <BR>
<BR>
<BR><TT><FONT COLOR="#990000"> p4 set P4EDITOR=<I>commandname</I></FONT></TT>
<BR><B> </B><HR>
<LI>
<A NAME="add a new..."></A><B>How do I add a new directory?</B></LI>
<BR>
<BR>You don't need to add a directory, explicitly. You simply add
files in that directory, using
<P><TT><FONT COLOR="#990000"> cd <I>directoryname</I><BR> p4 add
<I>filename</I></FONT></TT>
<P>or,
<P><TT><FONT COLOR="#990000"> p4 add
<I>directoryname</I>/<I>filename1 directoryname/filename2 </I>
</FONT></TT><I>(and so on)</I>
<P>The final step, which is to run <TT><FONT COLOR="#990000">p4
submit</FONT> </TT>, will make these new files available to other Perforce
clients.
<P>Perforce infers the existence of new directories whenever it sees a
new directory it hasn't seen before.
<HR>
<LI>
<A NAME="remove a..."></A><B>How do I remove a directory?</B></LI>
<P>
<BR>You don't need to remove a directory, explicitly. You simply
remove files in that directory, using
<BR>
<BR><TT><FONT COLOR="#990000"> cd <I>directoryname</I><BR> p4 delete
<I>filename</I></FONT></TT>
<BR>
<BR>or,
<BR><TT><FONT COLOR="#990000"> p4 delete
<I>directoryname</I>/<I>filename1 directoryname/filename2 </I>
</FONT></TT><I>(and so on)</I>
<P>and occasionally,
<BR>
<BR><TT><FONT COLOR="#990000"> p4 delete
<I>directoryname</I>/... </FONT></TT><I>(remove
all files in `directoryname' and its subdirectories)</I>
<P>The penultimate step, which is to run <TT><FONT COLOR="#990000">p4
submit</FONT> </TT>, will these deletions to other Perforce clients.
<P><B>The final step is to remove the empty directories on your client: "p4
delete / p4 submit" removed the files, but not the directories.</B>
<HR>
<LI>
<A NAME="check out some older version..."></A><B>How do I check out some
older version of a file?</B></LI>
<BR>
<BR>You'll need to retrieve that revision first, then <TT><FONT COLOR="#990000">p4
edit </FONT></TT>the file. That's the easy part. The hard part is deciding
how to submit the change. (Let's save that for later in the answer.)
<P>For example, if you want to edit revision #12 of xyz.java, you'll need
to type:
<BR>
<BR><TT> <FONT COLOR="#990000"> p4 sync
<I>xyz.java#12</I><BR> p4 edit
<I>xyz.java</I></FONT></TT>
<P>The first command, of course, isn't needed if you already have revision
#12 of <I>xyz.java</I>. (You can tell which revision you have by typing
<TT><FONT COLOR="#990000">p4 files <I>xyz.java</I> </FONT><FONT COLOR="#000000">.</FONT></TT>
<P><B><FONT COLOR="#000000">You'll be told, when you run </FONT><FONT COLOR="#990000">p4
edit xyz.java</FONT><FONT COLOR="#000000">, that you're not editing
the most recent revision and that you'll need to resolve later revisions
prior to submitting your changes. </FONT></B><FONT COLOR="#000000">(If
you think about it, that makes sense.)</FONT>
<BR>Now the file's opened for "edit", and you can do whatever you want
to the file. Submitting it, however, is going to be a problem: you don't
want to inadvertently overwrite the contents of later revisions of the
files.
<P><I>Case #1: you really do want to <U>overwrite</U> the later revisions
for some reason.</I>
<BR>
<UL>When you run the command...
<P><TT><FONT COLOR="#990000">
p4 submit</FONT></TT>
<P>you'll be told that the your changes need to be resolved against more
recent revisions prior to submitting. <B>Write down the change number
it gives in the error message (e.g. "submit -c 12345")</B>, although you
can always find it again by running the command <TT><FONT COLOR="#990000">p4
changes -s pending </FONT><FONT COLOR="#000000">.</FONT></TT>
<BR>
<BR>
<BR> </UL>
<I>Case #2: You don't want to overwrite anything - you were just experimenting
with an old version of a file to debug something.</I>
<BR>
<UL>From <A HREF="#abandon my changes and pick up...">another question</A>
in this FAQ: use <TT><FONT COLOR="#990000">p4 revert <I>filename</I>
</FONT></TT><FONT COLOR="#000000">to discard the modifications you've made
to <I>filename</I> and retrieve a fresh copy of the <U>exact same revision</U>
you had prior to typing</FONT> <TT><FONT COLOR="#990000">p4 edit
<I>filename</I> </FONT><FONT COLOR="#000000">.</FONT></TT>
<BR> </UL>
<HR>
<LI>
<A NAME="check out an entire tree as of..."></A><B>How do I check out an
entire tree as of some date?</B></LI>
<BR>
<H5>
For release 98.2...</H5>
<UL>There's an entry in the <A HREF="http://perforce.com/perforce/doc.982/user/relnotes.txt">release
notes</A> that says:</UL>
<UL>
<CENTER><TABLE COLS=1 WIDTH="70%" NOSAVE >
<TR NOSAVE>
<TD NOSAVE><I><FONT COLOR="#009900"> </FONT><FONT COLOR="#660000">Wherever
revision specifications are supported, @date and "@datetime" can now be
used in addition to @change and @label. The format for date is YYYY/MM/DD,
and the format for datetime is YYYY/MM/DD:HH:MM:SS. If no time is
given, midnight is assumed.</FONT></I></TD>
</TR>
</TABLE></CENTER>
</UL>
<UL>That means that the command <TT><FONT COLOR="#990000">p4 sync
...@<I>1998/09/02 </I></FONT></TT><FONT COLOR="#000000">will retrieve all
files that map to the current directory (and its subdirectories!), at the
revisions that were current at midnight on September 2, 1998.</FONT></UL>
<H5>
<FONT COLOR="#000000">For releases prior to 98.2...</FONT></H5>
<UL><FONT COLOR="#000000">You'll need to use </FONT> <FONT COLOR="#990000"><TT>p4
changes </TT> </FONT><FONT COLOR="#000000">to find the change
number <U>immediately prior</U> to the desired date, and then use the command </FONT>
<TT><FONT COLOR="#990000">p4 sync ...@<I>changenum</I> </FONT></TT><FONT COLOR="#000000">to
retrieve the fileset you want.</FONT></UL>
<HR>
<LI>
<A NAME="check out an entire tree..."></A><B>How do I check out an entire
tree corresponding to some build or release?</B></LI>
<P>In general, you'll need to have a piece of data from your build person:
the label name used for that build. (You can always hunt for it,
using the command <FONT COLOR="#000000"> </FONT>
<TT><FONT COLOR="#990000">p4 labels </FONT></TT><FONT COLOR="#000000">.)</FONT>
<P><FONT COLOR="#000000">If the label is <I> release3.2label</I>,
you can update your client area to this by typing:</FONT>
<P><TT><FONT COLOR="#990000"> p4 sync
@release3.2label</FONT></TT>
<P><FONT COLOR="#000000">This will update your client to this label, <U>removing
local copies of files that aren't in the label.</U></FONT>
<BR>
<BR>If you want subdirectory xyz to be updated, but no other directories
on your client, you would type:
<P><TT><FONT COLOR="#990000"> p4 sync
xyz/...@release3.2label</FONT></TT>
<BR> <HR>
<LI>
<A NAME="compare a working file to the..."></A><B>How do I compare a working
file to the base?</B></LI>
<BR>
<BR>Use <TT><FONT COLOR="#990000"> p4 diff <I>filename</I> </FONT></TT>,
which will compare the <U>local copy</U> of a file you've opened for edit
or an integrate operation against the revision of the file you were original
given.
<P>For example, say you've opened <I>xyz.java</I> using the command:
<BR>
<BR><TT> <FONT COLOR="#990000"> p4 edit
<I>xyz.java</I></FONT></TT>
<BR>
<BR>To see your modifications, type:
<BR>
<BR><TT> <FONT COLOR="#990000">p4 diff
<I>xyz.java</I></FONT></TT>
<BR>
<BR>Note that this is not comparing your local copy of the file against
the most recent changes that other people have checked in - it's comparing
against the revision you were working against. (That's <TT><FONT COLOR="#990000">p4
diff <I>filename#head </I></FONT>.)</TT><HR>
<LI>
<A NAME="compare a whole tree to the..."></A><B>How do I compare a whole
tree to the base?</B></LI>
<BR>
<BR>Use <TT><FONT COLOR="#990000">p4 diff <I>directory/...</I> </FONT></TT>,
which will compare the <U>local copy</U> of every file in <I>directory</I>
that is opened for edit or an integrate operation against the revision
of the file you were original given.
<P>For example, say you've opened <I>xyz.java</I> and<I> z.java
</I>in directory dir1 using the command:
<BR>
<BR><TT> <FONT COLOR="#990000"> p4 edit
<I>dir1/xyz.java dir1/z.java</I></FONT></TT>
<BR>
<BR>To see your modifications, type:
<BR>
<BR><TT> <FONT COLOR="#990000">p4 diff
<I>dir1/...</I></FONT></TT>
<BR>
<BR>Note that this is not comparing your local copy of the file against
the most recent changes that other people have checked in - it's comparing
against the revision you were working against. (That's <TT><FONT COLOR="#990000">p4
diff <I>dir1/...#head </I></FONT>.)</TT>
<HR>
<LI>
<A NAME="get my favorite diff behaviors..."></A><B>How do I get my favorite
diff behaviors with p4 diff?</B></LI>
<BR>
<BR>The environment variable $DIFF is the command line that's run when
you run:
<P><TT><FONT COLOR="#990000"> p4 diff <I>
file1 file2</I></FONT></TT>
<P><FONT COLOR="#000000">If, for example, the command </FONT><TT><FONT COLOR="#990000">"diff
-c"</FONT></TT><FONT COLOR="#000000"> produces "context output format",
then the sequence:</FONT>
<P><TT><FONT COLOR="#990000"> DIFF="diff
-c"<BR> export
DIFF<BR> p4 diff <I>
file1 file2</I></FONT></TT>
<P><FONT COLOR="#000000">will produce that type of output for the differences
between the two files.</FONT>
<P><FONT COLOR="#000000">Note that </FONT> <TT><FONT COLOR="#990000">p4
diff2 <I>file1 file2 </I></FONT></TT><FONT COLOR="#000000">doesn't
honor this variable, because the "diff" operation is run on the server
and only the formatted output is returned to the user.</FONT>
<BR> <HR>
<LI>
<A NAME="update a tree from the..."></A><B>How do I update a tree from
the base?</B></LI>
<BR>
<BR>Use <TT><FONT COLOR="#990000">p4 sync <I>directory/...</I> </FONT></TT>,
which will retrieve the most recent revision of every file in <I>directory</I>
(and its subdirectories!) that you haven't already got a copy of.
<BR>
<BR>This makes several assumptions:
<UL>
<LI>
That there's something to get - if you have already updated <I>directory</I>
to the most recent revisions and nothing's been changed since, <TT><FONT COLOR="#990000">p4
sync </FONT></TT><FONT COLOR="#000000">won't retrieve the revisions again.
(</FONT> <TT><FONT COLOR="#990000">p4 sync -f <I>directory/...#have</I>
</FONT></TT><FONT COLOR="#000000">will do that.)</FONT></LI>
<LI>
<FONT COLOR="#000000">That <I>directory</I> is located under your local
Perforce's client root. </FONT> The command...<BR>
<BR></LI>
<BR><TT><FONT COLOR="#990000"> p4 info</FONT></TT>
<BR>
<BR><FONT COLOR="#000000">will tell you what your client's root directory
is.</FONT>
<LI>
<FONT COLOR="#000000">That <I>directory</I> is mapped in from the Perforce
depot using your client specification. The command...</FONT><BR>
<BR></LI>
<BR><TT><FONT COLOR="#990000"> cd <I>directory</I><BR> p4 where <I>xxx</I></FONT></TT>
<P><FONT COLOR="#000000">will product output that looks something like:</FONT>
<BR><TT><FONT COLOR="#000000"> xxx - file(s) not in client
view.</FONT></TT>
<BR><FONT COLOR="#000000">if the directory's not included in your client
view. (You'll want to see the documentation for help on this, but you'll
know where to start: <U>client specification</U>.)</FONT></UL>
<HR>
<LI>
<A NAME="compare a working file to an..."></A><B>How do I compare a working
file to an older version (other than the base)?</B></LI>
<BR>
<BR>Use <TT><FONT COLOR="#990000"> p4 diff <I>filename#revision</I>
</FONT></TT>, which will compare the <U>working copy</U> of a file you've
opened for edit or an integrate operation against the revision of the file
you specify using "#revision".
<P>For example, say you've opened <I>xyz.java</I> using the command:
<BR>
<BR><TT> <FONT COLOR="#990000"> p4 edit
<I>xyz.java</I></FONT></TT>
<BR>
<BR>Various "diff" commands follow:
<BR>
<UL>
<DL>
<CENTER><TABLE BORDER WIDTH="80%" NOSAVE >
<TR NOSAVE>
<TD><TT><FONT COLOR="#990000">p4 diff <I>xyz.java</I></FONT></TT></TD>
<TD NOSAVE>Compares your working copy against the revision your edits are
on - if you are editing revision #4 of a file, this will compare your working
copy against revision #4.</TD>
</TR>
<TR>
<TD><TT><FONT COLOR="#990000">p4 diff <I>xyz.java#2</I></FONT></TT></TD>
<TD>Compares your working copy against the revision #2.</TD>
</TR>
<TR>
<TD><TT><FONT COLOR="#990000">p4 diff xyz.java#head </FONT></TT></TD>
<TD>Compares your working copy against the most recent revision in the
depot.</TD>
</TR>
<CAPTION ALIGN=BOTTOM> </CAPTION>
</TABLE></CENTER>
</DL>
</UL>
<HR>
<LI>
<A NAME="get a list of all files I have..."></A><B>How do I get a list
of all files I have open on all my client workspaces?</B></LI>
<BR>
<BR>If your username is <I>joe</I>, then the following command will show
you your opened files for all workspaces:
<P><TT><FONT COLOR="#990000"> p4 opened -a
| grep <I>joe</I></FONT></TT>
<P>If you don't have "grep" (i.e. you're on Windows) you'll need to search
the output of <TT><FONT COLOR="#990000">p4 opened</FONT></TT><FONT COLOR="#000000">
for this.</FONT>
<BR> <HR>
<LI>
<A NAME="examine the change log for a..."></A><B>How do I examine the change
log for a file?</B></LI>
<BR>
<BR>Use <TT><FONT COLOR="#990000">p4 filelog <I>filename</I> </FONT></TT><FONT COLOR="#000000">to
get the list of <U>revisions</U> since a file was created in a particular
codeline.</FONT>
<P>Use <TT><FONT COLOR="#990000">p4 changes -i <I>directory/...</I>
</FONT></TT><FONT COLOR="#000000">to get the list of <U>change numbers</U>
since a file stored originally in Perforce.</FONT>
<P><FONT COLOR="#000000">You'll recall that the difference between a <U>revision</U>
and a <U>change number</U> is that the revision is specific to a file...</FONT>
<BR><FONT COLOR="#000000"><TT> x.c#1
</TT><I>(revision #1 of file x.c)</I></FONT>
<BR><FONT COLOR="#000000"><TT> x.c#2
</TT><I>(revision #2 of file x.c)</I></FONT>
<BR><FONT COLOR="#000000"><TT> y.java#1
</TT><I>(revision #1 of file y.java)</I></FONT>
<BR><FONT COLOR="#000000"><TT> y.java#2
</TT><I>(revision #2 of file y.java)</I></FONT>
<BR><FONT COLOR="#000000"><TT> y.java#3
</TT><I>(revision #3 of file y.java)</I></FONT>
<BR><FONT COLOR="#000000">The change number is a list of revisions that
got changed as part of one atomic change to the Perforce depot. For example,
change #12345 might be a change to add comments to x.c and y.java, and
this change might've created revision #2 of<I> x.c</I> and #3 of <I>y.java.</I></FONT><HR>
<LI>
<A NAME="abandon my changes and pick up..."></A><B>How do I abandon my
changes and pick up a clean copy from the base?</B></LI>
<BR>
<BR>Use <TT><FONT COLOR="#990000">p4 revert <I>filename</I> </FONT></TT><FONT COLOR="#000000">to
discard the modifications you've made to <I>filename</I> and retrieve a
fresh copy of the <U>exact same revision</U> you had prior to typing</FONT>
<TT><FONT COLOR="#990000">p4 edit <I>filename</I> </FONT><FONT COLOR="#000000">.</FONT></TT>
<P>Use <TT><FONT COLOR="#990000">p4 revert <I>directory/...</I> </FONT></TT><FONT COLOR="#000000">to
discard all the modifications you've made to any file in <I>directory</I>
(or its subdirectories).</FONT><HR>
<LI>
<A NAME="propagate an individual change..."></A><B>How do I propagate an
individual change made in one branch to another?</B></LI>
<P>Let's say you have a main codeline, and a child codeline ("branch")
called <I>methusalah</I>.
<P>If you wanted to propogate change #900 from the main codeline to <I>methusalah</I>,
you'd type:
<BR>
<OL><TT><FONT COLOR="#990000">p4 integrate -b <I>methusalah</I> @900,900</FONT></TT></OL>
<P>Of course, if you wanted to propogate change #902 from methusalah to
the main codeline, you'd type:
<BR>
<OL><TT><FONT COLOR="#990000">p4 integrate -b <I>methusalah</I> -r
@902,902</FONT></TT><BR>
<BR></OL>
<FONT COLOR="#000000">The subsequent resolve/submit combination is
left as an exercise.</FONT>
<P><FONT COLOR="#000000">It's a good idea to include the original change
number in the change description for the integration.</FONT>
<BR> <HR>
<LI>
<A NAME="deleting weird file"></A>
<b>I created a file that begins with a dash, and
want to 'p4 delete' it and cannot. What can I do?</b>
<p>
Let's say that the name of the file is <i>"-filename"</i>.
<p>
Run "<font COLOR="#990000">p4 delete dummy -filename</font>"
to delete the file - ignore the comment about the dummy filename, its
purpose is to stop the option/argument processing and let everything else
on the command line be interpreted as filenames.
<p>
<i>Or, you could run "<font COLOR="#990000">p4 delete ./-filename</font>", which uses the Unix directory separator ('/') to construct a
filename that refers to the same file, but doesn't begin with a dash.
(NT uses might use '\'.)</i>
</LI>
<br>
<hr>
<LI>
<A NAME="delete a client..."></A><B>How do I delete a client workspace?</B></LI>
<BR>
<BR><FONT COLOR="#000000">Use </FONT> <TT><FONT COLOR="#990000">p4
client -d <I>workspacename</I> </FONT></TT><FONT COLOR="#990000">
</FONT><FONT COLOR="#000000">to do this. The steps are:</FONT>
<UL><li><FONT COLOR="#000000">Set $P4CLIENT to the name of the workspace, or
make sure that every command you run for this task uses the syntax</FONT>
<P><TT><FONT COLOR="#990000"> p4 -c
<I>workspacename</I> cmd</FONT></TT>
<BR>
<LI>
<FONT COLOR="#000000">Run </FONT> <FONT COLOR="#990000"><TT>p4
opened </TT> </FONT><FONT COLOR="#000000">to make sure that
no files are opened for any operations in this workspace. If there are,
use the command...</FONT></LI>
<P><TT><FONT COLOR="#990000"> p4 revert
<I>filelist</I></FONT></TT>
<P><FONT COLOR="#000000">... to revert them.</FONT>
<LI>
<FONT COLOR="#000000">Remove the workspace entry on the Perforce server...</FONT></LI>
<P><TT><FONT COLOR="#990000"> p4 client
-d <I>workspacename</I></FONT></TT>
<BR>
<LI>
<FONT COLOR="#000000">Remove the files and directories on the local disk
that correspond to the client area.</FONT></LI>
</UL>
<HR>
<LI>
<A NAME="move a client..."></A><B>How do I move a client workspace?</B></LI>
<P>It's easy, but requires a little planning.
<BR>
<OL>
<LI>
Figure out the new client "root". Let's say it's "/home/jojo/newroot".</LI>
<LI>
If you're using the Windows GUI program against this particular Perforce
client, exit the GUI.</LI>
<LI>
Move the entire subtree from its old place to "/home/jojo/newroot".</LI>
<BR>Run <TT><FONT COLOR="#990000">p4 client<I> </I></FONT></TT><FONT COLOR="#000000">
, which will dump you into the editor - you'll be changing the client specification.
Change the "Root:" field to the name "/home/jojo/newroot" and save the
file.</FONT>
<BR> </OL>
</OL>
<hr>
<LI>
<A NAME="#I can't sync...">I can't "p4 sync" a particular file. What might be going on?</li>
<p>
Let's say that you can retrieve all the files in the
directory (using the depot name syntax) //bas/BIN/src/krn/rsec/
except the file //bas/BIN/src/krn/rsec/rsecstoc.c.
<p>
It could be several things:
<ol>
<li>The other files it gets are in the directory
<tt>//bas/bin/src/krn/rsec/...</tt>
If that's the case, you're up against upper-case/lower-case issues.
(The NT version of the server ignores case; the Unix version of
the server does not.) If this is the case, it'll be easiest to
go to a Unix client and rename the file to be in the same directory
as the files that are succeeding. ("p4 help rename" gives the steps
for renaming a file.)
<li>You might not have permissions on this file from this IP address
for this user. Use "p4 protect -o" and "p4 where" to make sure that
isn't the case.
<li>The client spec might not be mapping that file as you expect.
The command
"<TT><FONT COLOR="#990000">p4 where //bas/BIN/src/krn/rsec/rsecstoc.c<I> </I></FONT></TT><FONT COLOR="#000000">"
will process
the argument filename through the client spec [processing] code to
tell you where it would be mapped.
<li>The top-most revision of that file might be a "delete" revision,
so that there's nothing to get(!).
("<TT><FONT COLOR="#990000">p4 files //bas/BIN/src/krn/rsec/rsecstoc.c<I> </I></FONT></TT><FONT COLOR="#000000">"
will tell you the type of the top-most revision of the file.)
<li>There might be nothing to get, because it thinks you have the
most recent revision. "p4 have //bas/BIN/src/krn/rsec/rsecstoc.c" will
tell you if you already have a revision for that file, or at least
whether the database thinks you do.
("<TT><FONT COLOR="#990000">p4 sync -f //bas/BIN/src/krn/rsec/rsecstoc.c<I> </I></FONT></TT><FONT COLOR="#000000">"
will force getting a fresh revision.)
</ol>
</OL>
<P><I>Last modified on 11 November 1998.</I>
</BODY>
</HTML>