Merge with git://kernel.org/pub/scm/git/git.git
This commit is contained in:
commit
e660e3997f
@ -79,7 +79,7 @@ clean:
|
||||
asciidoc -b xhtml11 -d manpage -f asciidoc.conf $<
|
||||
|
||||
%.1 %.7 : %.xml
|
||||
xmlto man $<
|
||||
xmlto -m callouts.xsl man $<
|
||||
|
||||
%.xml : %.txt
|
||||
asciidoc -b docbook -d manpage -f asciidoc.conf $<
|
||||
|
16
Documentation/callouts.xsl
Normal file
16
Documentation/callouts.xsl
Normal file
@ -0,0 +1,16 @@
|
||||
<!-- callout.xsl: converts asciidoc callouts to man page format -->
|
||||
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
|
||||
<xsl:template match="co">
|
||||
<xsl:value-of select="concat('\fB(',substring-after(@id,'-'),')\fR')"/>
|
||||
</xsl:template>
|
||||
<xsl:template match="calloutlist">
|
||||
<xsl:text>.sp </xsl:text>
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text> </xsl:text>
|
||||
</xsl:template>
|
||||
<xsl:template match="callout">
|
||||
<xsl:value-of select="concat('\fB',substring-after(@arearefs,'-'),'. \fR')"/>
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text>.br </xsl:text>
|
||||
</xsl:template>
|
||||
</xsl:stylesheet>
|
@ -61,7 +61,8 @@ $ git prune
|
||||
$ git count-objects <2>
|
||||
$ git repack <3>
|
||||
$ git prune <4>
|
||||
|
||||
------------
|
||||
+
|
||||
<1> running without "--full" is usually cheap and assures the
|
||||
repository health reasonably well.
|
||||
<2> check how many loose objects there are and how much
|
||||
@ -69,17 +70,16 @@ diskspace is wasted by not repacking.
|
||||
<3> without "-a" repacks incrementally. repacking every 4-5MB
|
||||
of loose objects accumulation may be a good rule of thumb.
|
||||
<4> after repack, prune removes the duplicate loose objects.
|
||||
------------
|
||||
|
||||
Repack a small project into single pack.::
|
||||
+
|
||||
------------
|
||||
$ git repack -a -d <1>
|
||||
$ git prune
|
||||
|
||||
------------
|
||||
+
|
||||
<1> pack all the objects reachable from the refs into one pack
|
||||
and remove unneeded other packs
|
||||
------------
|
||||
|
||||
|
||||
Individual Developer (Standalone)[[Individual Developer (Standalone)]]
|
||||
@ -129,10 +129,10 @@ $ git-init-db
|
||||
$ git add . <1>
|
||||
$ git commit -m 'import of frotz source tree.'
|
||||
$ git tag v2.43 <2>
|
||||
|
||||
------------
|
||||
+
|
||||
<1> add everything under the current directory.
|
||||
<2> make a lightweight, unannotated tag.
|
||||
------------
|
||||
|
||||
Create a topic branch and develop.::
|
||||
+
|
||||
@ -153,7 +153,8 @@ $ git checkout master <9>
|
||||
$ git pull . alsa-audio <10>
|
||||
$ git log --since='3 days ago' <11>
|
||||
$ git log v2.43.. curses/ <12>
|
||||
|
||||
------------
|
||||
+
|
||||
<1> create a new topic branch.
|
||||
<2> revert your botched changes in "curses/ux_audio_oss.c".
|
||||
<3> you need to tell git if you added a new file; removal and
|
||||
@ -170,7 +171,6 @@ you originally wrote.
|
||||
combined and include --max-count=10 (show 10 commits), --until='2005-12-10'.
|
||||
<12> view only the changes that touch what's in curses/
|
||||
directory, since v2.43 tag.
|
||||
------------
|
||||
|
||||
|
||||
Individual Developer (Participant)[[Individual Developer (Participant)]]
|
||||
@ -208,7 +208,8 @@ $ git pull git://git.kernel.org/pub/.../jgarzik/libata-dev.git ALL <5>
|
||||
$ git reset --hard ORIG_HEAD <6>
|
||||
$ git prune <7>
|
||||
$ git fetch --tags <8>
|
||||
|
||||
------------
|
||||
+
|
||||
<1> repeat as needed.
|
||||
<2> extract patches from your branch for e-mail submission.
|
||||
<3> "pull" fetches from "origin" by default and merges into the
|
||||
@ -221,7 +222,6 @@ area we are interested in.
|
||||
<7> garbage collect leftover objects from reverted pull.
|
||||
<8> from time to time, obtain official tags from the "origin"
|
||||
and store them under .git/refs/tags/.
|
||||
------------
|
||||
|
||||
|
||||
Push into another repository.::
|
||||
@ -239,7 +239,8 @@ satellite$ git push origin <4>
|
||||
mothership$ cd frotz
|
||||
mothership$ git checkout master
|
||||
mothership$ git pull . satellite <5>
|
||||
|
||||
------------
|
||||
+
|
||||
<1> mothership machine has a frotz repository under your home
|
||||
directory; clone from it to start a repository on the satellite
|
||||
machine.
|
||||
@ -252,7 +253,6 @@ to local "origin" branch.
|
||||
mothership machine. You could use this as a back-up method.
|
||||
<5> on mothership machine, merge the work done on the satellite
|
||||
machine into the master branch.
|
||||
------------
|
||||
|
||||
Branch off of a specific tag.::
|
||||
+
|
||||
@ -262,12 +262,12 @@ $ edit/compile/test; git commit -a
|
||||
$ git checkout master
|
||||
$ git format-patch -k -m --stdout v2.6.14..private2.6.14 |
|
||||
git am -3 -k <2>
|
||||
|
||||
------------
|
||||
+
|
||||
<1> create a private branch based on a well known (but somewhat behind)
|
||||
tag.
|
||||
<2> forward port all changes in private2.6.14 branch to master branch
|
||||
without a formal "merging".
|
||||
------------
|
||||
|
||||
|
||||
Integrator[[Integrator]]
|
||||
@ -317,7 +317,8 @@ $ git tag -s -m 'GIT 0.99.9x' v0.99.9x <10>
|
||||
$ git fetch ko && git show-branch master maint 'tags/ko-*' <11>
|
||||
$ git push ko <12>
|
||||
$ git push ko v0.99.9x <13>
|
||||
|
||||
------------
|
||||
+
|
||||
<1> see what I was in the middle of doing, if any.
|
||||
<2> see what topic branches I have and think about how ready
|
||||
they are.
|
||||
@ -346,7 +347,6 @@ In the output from "git show-branch", "master" should have
|
||||
everything "ko-master" has.
|
||||
<12> push out the bleeding edge.
|
||||
<13> push the tag out, too.
|
||||
------------
|
||||
|
||||
|
||||
Repository Administration[[Repository Administration]]
|
||||
@ -367,7 +367,6 @@ example of managing a shared central repository.
|
||||
|
||||
Examples
|
||||
~~~~~~~~
|
||||
|
||||
Run git-daemon to serve /pub/scm from inetd.::
|
||||
+
|
||||
------------
|
||||
@ -388,13 +387,13 @@ cindy:x:1002:1002::/home/cindy:/usr/bin/git-shell
|
||||
david:x:1003:1003::/home/david:/usr/bin/git-shell
|
||||
$ grep git /etc/shells <2>
|
||||
/usr/bin/git-shell
|
||||
|
||||
------------
|
||||
+
|
||||
<1> log-in shell is set to /usr/bin/git-shell, which does not
|
||||
allow anything but "git push" and "git pull". The users should
|
||||
get an ssh access to the machine.
|
||||
<2> in many distributions /etc/shells needs to list what is used
|
||||
as the login shell.
|
||||
------------
|
||||
|
||||
CVS-style shared repository.::
|
||||
+
|
||||
@ -419,7 +418,8 @@ $ cat info/allowed-users <4>
|
||||
refs/heads/master alice\|cindy
|
||||
refs/heads/doc-update bob
|
||||
refs/tags/v[0-9]* david
|
||||
|
||||
------------
|
||||
+
|
||||
<1> place the developers into the same git group.
|
||||
<2> and make the shared repository writable by the group.
|
||||
<3> use update-hook example by Carl from Documentation/howto/
|
||||
@ -427,7 +427,6 @@ for branch policy control.
|
||||
<4> alice and cindy can push into master, only bob can push into doc-update.
|
||||
david is the release manager and is the only person who can
|
||||
create and push version tags.
|
||||
------------
|
||||
|
||||
HTTP server to support dumb protocol transfer.::
|
||||
+
|
||||
@ -435,7 +434,7 @@ HTTP server to support dumb protocol transfer.::
|
||||
dev$ git update-server-info <1>
|
||||
dev$ ftp user@isp.example.com <2>
|
||||
ftp> cp -r .git /home/user/myproject.git
|
||||
|
||||
------------
|
||||
+
|
||||
<1> make sure your info/refs and objects/info/packs are up-to-date
|
||||
<2> upload to public HTTP server hosted by your ISP.
|
||||
------------
|
||||
|
@ -3,22 +3,27 @@ git-branch(1)
|
||||
|
||||
NAME
|
||||
----
|
||||
git-branch - Create a new branch, or remove an old one
|
||||
git-branch - List, create, or delete branches.
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
'git-branch' [[-f] <branchname> [<start-point>]]
|
||||
'git-branch' (-d | -D) <branchname>
|
||||
'git-branch' [-r]
|
||||
'git-branch' [-f] <branchname> [<start-point>]
|
||||
'git-branch' (-d | -D) <branchname>...
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
If no argument is provided, show available branches and mark current
|
||||
branch with star. Otherwise, create a new branch of name <branchname>.
|
||||
If a starting point is also specified, that will be where the branch is
|
||||
created, otherwise it will be created at the current HEAD.
|
||||
With no arguments given (or just `-r`) a list of available branches
|
||||
will be shown, the current branch will be highlighted with an asterisk.
|
||||
|
||||
With a `-d` or `-D` option, `<branchname>` will be deleted.
|
||||
In its second form, a new branch named <branchname> will be created.
|
||||
It will start out with a head equal to the one given as <start-point>.
|
||||
If no <start-point> is given, the branch will be created with a head
|
||||
equal to that of the currently checked out branch.
|
||||
|
||||
With a `-d` or `-D` option, `<branchname>` will be deleted. You may
|
||||
specify more than one branch for deletion.
|
||||
|
||||
|
||||
OPTIONS
|
||||
@ -30,40 +35,56 @@ OPTIONS
|
||||
Delete a branch irrespective of its index status.
|
||||
|
||||
-f::
|
||||
Force a reset of <branchname> to <start-point> (or current head).
|
||||
Force the creation of a new branch even if it means deleting
|
||||
a branch that already exists with the same name.
|
||||
|
||||
-r::
|
||||
List only the "remote" branches.
|
||||
|
||||
<branchname>::
|
||||
The name of the branch to create or delete.
|
||||
|
||||
<start-point>::
|
||||
Where to create the branch; defaults to HEAD. This
|
||||
option has no meaning with -d and -D.
|
||||
The new branch will be created with a HEAD equal to this. It may
|
||||
be given as a branch name, a commit-id, or a tag. If this option
|
||||
is omitted, the current branch is assumed.
|
||||
|
||||
|
||||
|
||||
Examples
|
||||
~~~~~~~~
|
||||
--------
|
||||
|
||||
Start development off of a known tag::
|
||||
+
|
||||
------------
|
||||
$ git clone git://git.kernel.org/pub/scm/.../linux-2.6 my2.6
|
||||
$ cd my2.6
|
||||
$ git branch my2.6.14 v2.6.14 <1>
|
||||
$ git branch my2.6.14 v2.6.14 <1>
|
||||
$ git checkout my2.6.14
|
||||
|
||||
<1> These two steps are the same as "checkout -b my2.6.14 v2.6.14".
|
||||
------------
|
||||
+
|
||||
<1> This step and the next one could be combined into a single step with
|
||||
"checkout -b my2.6.14 v2.6.14".
|
||||
|
||||
Delete unneeded branch::
|
||||
+
|
||||
------------
|
||||
$ git clone git://git.kernel.org/.../git.git my.git
|
||||
$ cd my.git
|
||||
$ git branch -D todo <1>
|
||||
|
||||
$ git branch -D todo <1>
|
||||
------------
|
||||
+
|
||||
<1> delete todo branch even if the "master" branch does not have all
|
||||
commits from todo branch.
|
||||
------------
|
||||
|
||||
|
||||
Notes
|
||||
-----
|
||||
|
||||
If you are creating a branch that you want to immediately checkout, it's
|
||||
easier to use the git checkout command with its `-b` option to create
|
||||
a branch and check it out with a single command.
|
||||
|
||||
|
||||
Author
|
||||
------
|
||||
|
@ -66,19 +66,19 @@ the `Makefile` to two revisions back, deletes hello.c by
|
||||
mistake, and gets it back from the index.
|
||||
+
|
||||
------------
|
||||
$ git checkout master <1>
|
||||
$ git checkout master~2 Makefile <2>
|
||||
$ git checkout master <1>
|
||||
$ git checkout master~2 Makefile <2>
|
||||
$ rm -f hello.c
|
||||
$ git checkout hello.c <3>
|
||||
|
||||
<1> switch branch
|
||||
<2> take out a file out of other commit
|
||||
<3> or "git checkout -- hello.c", as in the next example.
|
||||
$ git checkout hello.c <3>
|
||||
------------
|
||||
+
|
||||
If you have an unfortunate branch that is named `hello.c`, the
|
||||
last step above would be confused as an instruction to switch to
|
||||
that branch. You should instead write:
|
||||
<1> switch branch
|
||||
<2> take out a file out of other commit
|
||||
<3> restore hello.c from HEAD of current branch
|
||||
+
|
||||
If you have an unfortunate branch that is named `hello.c`, this
|
||||
step would be confused as an instruction to switch to that branch.
|
||||
You should instead write:
|
||||
+
|
||||
------------
|
||||
$ git checkout -- hello.c
|
||||
|
@ -46,40 +46,41 @@ EXAMPLES
|
||||
Various ways to check your working tree::
|
||||
+
|
||||
------------
|
||||
$ git diff <1>
|
||||
$ git diff --cached <2>
|
||||
$ git diff HEAD <3>
|
||||
|
||||
$ git diff <1>
|
||||
$ git diff --cached <2>
|
||||
$ git diff HEAD <3>
|
||||
------------
|
||||
+
|
||||
<1> changes in the working tree since your last git-update-index.
|
||||
<2> changes between the index and your last commit; what you
|
||||
would be committing if you run "git commit" without "-a" option.
|
||||
<3> changes in the working tree since your last commit; what you
|
||||
would be committing if you run "git commit -a"
|
||||
------------
|
||||
|
||||
Comparing with arbitrary commits::
|
||||
+
|
||||
------------
|
||||
$ git diff test <1>
|
||||
$ git diff HEAD -- ./test <2>
|
||||
$ git diff HEAD^ HEAD <3>
|
||||
|
||||
$ git diff test <1>
|
||||
$ git diff HEAD -- ./test <2>
|
||||
$ git diff HEAD^ HEAD <3>
|
||||
------------
|
||||
+
|
||||
<1> instead of using the tip of the current branch, compare with the
|
||||
tip of "test" branch.
|
||||
<2> instead of comparing with the tip of "test" branch, compare with
|
||||
the tip of the current branch, but limit the comparison to the
|
||||
file "test".
|
||||
<3> compare the version before the last commit and the last commit.
|
||||
------------
|
||||
|
||||
|
||||
Limiting the diff output::
|
||||
+
|
||||
------------
|
||||
$ git diff --diff-filter=MRC <1>
|
||||
$ git diff --name-status -r <2>
|
||||
$ git diff arch/i386 include/asm-i386 <3>
|
||||
|
||||
$ git diff --diff-filter=MRC <1>
|
||||
$ git diff --name-status -r <2>
|
||||
$ git diff arch/i386 include/asm-i386 <3>
|
||||
------------
|
||||
+
|
||||
<1> show only modification, rename and copy, but not addition
|
||||
nor deletion.
|
||||
<2> show only names and the nature of change, but not actual
|
||||
@ -88,18 +89,17 @@ which in turn also disables recursive behaviour, so without -r
|
||||
you would only see the directory name if there is a change in a
|
||||
file in a subdirectory.
|
||||
<3> limit diff output to named subtrees.
|
||||
------------
|
||||
|
||||
Munging the diff output::
|
||||
+
|
||||
------------
|
||||
$ git diff --find-copies-harder -B -C <1>
|
||||
$ git diff -R <2>
|
||||
|
||||
$ git diff --find-copies-harder -B -C <1>
|
||||
$ git diff -R <2>
|
||||
------------
|
||||
+
|
||||
<1> spend extra cycles to find renames, copies and complete
|
||||
rewrites (very expensive).
|
||||
<2> output diff in reverse.
|
||||
------------
|
||||
|
||||
|
||||
Author
|
||||
|
@ -60,12 +60,12 @@ Start a new git repository for an existing code base::
|
||||
+
|
||||
----------------
|
||||
$ cd /path/to/my/codebase
|
||||
$ git-init-db <1>
|
||||
$ git-add . <2>
|
||||
|
||||
$ git-init-db <1>
|
||||
$ git-add . <2>
|
||||
----------------
|
||||
+
|
||||
<1> prepare /path/to/my/codebase/.git directory
|
||||
<2> add all existing file to the index
|
||||
----------------
|
||||
|
||||
|
||||
Author
|
||||
|
@ -14,13 +14,12 @@ DESCRIPTION
|
||||
-----------
|
||||
Shows the commit logs.
|
||||
|
||||
The command takes options applicable to the gitlink::git-rev-list[1]
|
||||
The command takes options applicable to the gitlink:git-rev-list[1]
|
||||
command to control what is shown and how, and options applicable to
|
||||
the gitlink::git-diff-tree[1] commands to control how the change
|
||||
the gitlink:git-diff-tree[1] commands to control how the change
|
||||
each commit introduces are shown.
|
||||
|
||||
This manual page describes only the most frequently used
|
||||
options.
|
||||
This manual page describes only the most frequently used options.
|
||||
|
||||
|
||||
OPTIONS
|
||||
|
@ -15,6 +15,7 @@ SYNOPSIS
|
||||
'git-repo-config' [type] --get-all name [value_regex]
|
||||
'git-repo-config' [type] --unset name [value_regex]
|
||||
'git-repo-config' [type] --unset-all name [value_regex]
|
||||
'git-repo-config' -l | --list
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
@ -64,6 +65,9 @@ OPTIONS
|
||||
--unset-all::
|
||||
Remove all matching lines from .git/config.
|
||||
|
||||
-l, --list::
|
||||
List all variables set in .git/config.
|
||||
|
||||
|
||||
EXAMPLE
|
||||
-------
|
||||
|
@ -49,10 +49,11 @@ Undo a commit and redo::
|
||||
+
|
||||
------------
|
||||
$ git commit ...
|
||||
$ git reset --soft HEAD^ <1>
|
||||
$ edit <2>
|
||||
$ git commit -a -c ORIG_HEAD <3>
|
||||
|
||||
$ git reset --soft HEAD^ <1>
|
||||
$ edit <2>
|
||||
$ git commit -a -c ORIG_HEAD <3>
|
||||
------------
|
||||
+
|
||||
<1> This is most often done when you remembered what you
|
||||
just committed is incomplete, or you misspelled your commit
|
||||
message, or both. Leaves working tree as it was before "reset".
|
||||
@ -60,43 +61,43 @@ message, or both. Leaves working tree as it was before "reset".
|
||||
<3> "reset" copies the old head to .git/ORIG_HEAD; redo the
|
||||
commit by starting with its log message. If you do not need to
|
||||
edit the message further, you can give -C option instead.
|
||||
------------
|
||||
|
||||
Undo commits permanently::
|
||||
+
|
||||
------------
|
||||
$ git commit ...
|
||||
$ git reset --hard HEAD~3 <1>
|
||||
|
||||
$ git reset --hard HEAD~3 <1>
|
||||
------------
|
||||
+
|
||||
<1> The last three commits (HEAD, HEAD^, and HEAD~2) were bad
|
||||
and you do not want to ever see them again. Do *not* do this if
|
||||
you have already given these commits to somebody else.
|
||||
------------
|
||||
|
||||
Undo a commit, making it a topic branch::
|
||||
+
|
||||
------------
|
||||
$ git branch topic/wip <1>
|
||||
$ git reset --hard HEAD~3 <2>
|
||||
$ git checkout topic/wip <3>
|
||||
|
||||
$ git branch topic/wip <1>
|
||||
$ git reset --hard HEAD~3 <2>
|
||||
$ git checkout topic/wip <3>
|
||||
------------
|
||||
+
|
||||
<1> You have made some commits, but realize they were premature
|
||||
to be in the "master" branch. You want to continue polishing
|
||||
them in a topic branch, so create "topic/wip" branch off of the
|
||||
current HEAD.
|
||||
<2> Rewind the master branch to get rid of those three commits.
|
||||
<3> Switch to "topic/wip" branch and keep working.
|
||||
------------
|
||||
|
||||
Undo update-index::
|
||||
+
|
||||
------------
|
||||
$ edit <1>
|
||||
$ edit <1>
|
||||
$ git-update-index frotz.c filfre.c
|
||||
$ mailx <2>
|
||||
$ git reset <3>
|
||||
$ git pull git://info.example.com/ nitfol <4>
|
||||
|
||||
$ mailx <2>
|
||||
$ git reset <3>
|
||||
$ git pull git://info.example.com/ nitfol <4>
|
||||
------------
|
||||
+
|
||||
<1> you are happily working on something, and find the changes
|
||||
in these files are in good order. You do not want to see them
|
||||
when you run "git diff", because you plan to work on other files
|
||||
@ -109,12 +110,11 @@ index changes for these two files. Your changes in working tree
|
||||
remain there.
|
||||
<4> then you can pull and merge, leaving frotz.c and filfre.c
|
||||
changes still in the working tree.
|
||||
------------
|
||||
|
||||
Undo a merge or pull::
|
||||
+
|
||||
------------
|
||||
$ git pull <1>
|
||||
$ git pull <1>
|
||||
Trying really trivial in-index merge...
|
||||
fatal: Merge requires file-level merging
|
||||
Nope.
|
||||
@ -122,20 +122,19 @@ Nope.
|
||||
Auto-merging nitfol
|
||||
CONFLICT (content): Merge conflict in nitfol
|
||||
Automatic merge failed/prevented; fix up by hand
|
||||
$ git reset --hard <2>
|
||||
|
||||
$ git reset --hard <2>
|
||||
$ git pull . topic/branch <3>
|
||||
Updating from 41223... to 13134...
|
||||
Fast forward
|
||||
$ git reset --hard ORIG_HEAD <4>
|
||||
------------
|
||||
+
|
||||
<1> try to update from the upstream resulted in a lot of
|
||||
conflicts; you were not ready to spend a lot of time merging
|
||||
right now, so you decide to do that later.
|
||||
<2> "pull" has not made merge commit, so "git reset --hard"
|
||||
which is a synonym for "git reset --hard HEAD" clears the mess
|
||||
from the index file and the working tree.
|
||||
|
||||
$ git pull . topic/branch <3>
|
||||
Updating from 41223... to 13134...
|
||||
Fast forward
|
||||
$ git reset --hard ORIG_HEAD <4>
|
||||
|
||||
<3> merge a topic branch into the current branch, which resulted
|
||||
in a fast forward.
|
||||
<4> but you decided that the topic branch is not ready for public
|
||||
@ -143,7 +142,6 @@ consumption yet. "pull" or "merge" always leaves the original
|
||||
tip of the current branch in ORIG_HEAD, so resetting hard to it
|
||||
brings your index file and the working tree back to that state,
|
||||
and resets the tip of the branch to that commit.
|
||||
------------
|
||||
|
||||
Interrupted workflow::
|
||||
+
|
||||
@ -155,21 +153,21 @@ need to get to the other branch for a quick bugfix.
|
||||
------------
|
||||
$ git checkout feature ;# you were working in "feature" branch and
|
||||
$ work work work ;# got interrupted
|
||||
$ git commit -a -m 'snapshot WIP' <1>
|
||||
$ git commit -a -m 'snapshot WIP' <1>
|
||||
$ git checkout master
|
||||
$ fix fix fix
|
||||
$ git commit ;# commit with real log
|
||||
$ git checkout feature
|
||||
$ git reset --soft HEAD^ ;# go back to WIP state <2>
|
||||
$ git reset <3>
|
||||
|
||||
$ git reset --soft HEAD^ ;# go back to WIP state <2>
|
||||
$ git reset <3>
|
||||
------------
|
||||
+
|
||||
<1> This commit will get blown away so a throw-away log message is OK.
|
||||
<2> This removes the 'WIP' commit from the commit history, and sets
|
||||
your working tree to the state just before you made that snapshot.
|
||||
<3> After <2>, the index file still has all the WIP changes you
|
||||
committed in <1>. This sets it to the last commit you were
|
||||
basing the WIP changes on.
|
||||
------------
|
||||
<3> At this point the index file still has all the WIP changes you
|
||||
committed as 'snapshot WIP'. This updates the index to show your
|
||||
WIP files as uncommitted.
|
||||
|
||||
Author
|
||||
------
|
||||
|
@ -247,34 +247,33 @@ To update and refresh only the files already checked out:
|
||||
$ git-checkout-index -n -f -a && git-update-index --ignore-missing --refresh
|
||||
----------------
|
||||
|
||||
On an inefficient filesystem with `core.ignorestat` set:
|
||||
|
||||
On an inefficient filesystem with `core.ignorestat` set::
|
||||
+
|
||||
------------
|
||||
$ git update-index --really-refresh <1>
|
||||
$ git update-index --no-assume-unchanged foo.c <2>
|
||||
$ git diff --name-only <3>
|
||||
$ git update-index --really-refresh <1>
|
||||
$ git update-index --no-assume-unchanged foo.c <2>
|
||||
$ git diff --name-only <3>
|
||||
$ edit foo.c
|
||||
$ git diff --name-only <4>
|
||||
$ git diff --name-only <4>
|
||||
M foo.c
|
||||
$ git update-index foo.c <5>
|
||||
$ git diff --name-only <6>
|
||||
$ git update-index foo.c <5>
|
||||
$ git diff --name-only <6>
|
||||
$ edit foo.c
|
||||
$ git diff --name-only <7>
|
||||
$ git update-index --no-assume-unchanged foo.c <8>
|
||||
$ git diff --name-only <9>
|
||||
$ git diff --name-only <7>
|
||||
$ git update-index --no-assume-unchanged foo.c <8>
|
||||
$ git diff --name-only <9>
|
||||
M foo.c
|
||||
|
||||
<1> forces lstat(2) to set "assume unchanged" bits for paths
|
||||
that match index.
|
||||
------------
|
||||
+
|
||||
<1> forces lstat(2) to set "assume unchanged" bits for paths that match index.
|
||||
<2> mark the path to be edited.
|
||||
<3> this does lstat(2) and finds index matches the path.
|
||||
<4> this does lstat(2) and finds index does not match the path.
|
||||
<4> this does lstat(2) and finds index does *not* match the path.
|
||||
<5> registering the new version to index sets "assume unchanged" bit.
|
||||
<6> and it is assumed unchanged.
|
||||
<7> even after you edit it.
|
||||
<8> you can tell about the change after the fact.
|
||||
<9> now it checks with lstat(2) and finds it has been changed.
|
||||
------------
|
||||
|
||||
|
||||
Configuration
|
||||
|
@ -19,7 +19,8 @@ OPTIONS
|
||||
-l::
|
||||
Cause the logical variables to be listed. In addition, all the
|
||||
variables of the git configuration file .git/config are listed
|
||||
as well.
|
||||
as well. (However, the configuration variables listing functionality
|
||||
is deprecated in favor of `git-repo-config -l`.)
|
||||
|
||||
EXAMPLE
|
||||
--------
|
||||
|
6
Makefile
6
Makefile
@ -199,7 +199,7 @@ LIB_H = \
|
||||
tree-walk.h log-tree.h
|
||||
|
||||
DIFF_OBJS = \
|
||||
diff-lib.o diffcore-break.o diffcore-order.o \
|
||||
diff.o diff-lib.o diffcore-break.o diffcore-order.o \
|
||||
diffcore-pickaxe.o diffcore-rename.o tree-diff.o combine-diff.o \
|
||||
diffcore-delta.o log-tree.o
|
||||
|
||||
@ -575,12 +575,12 @@ $(patsubst git-%$X,%.o,$(PROGRAMS)): $(GITLIBS)
|
||||
$(DIFF_OBJS): diffcore.h
|
||||
|
||||
$(LIB_FILE): $(LIB_OBJS)
|
||||
$(AR) rcs $@ $(LIB_OBJS)
|
||||
rm -f $@ && $(AR) rcs $@ $(LIB_OBJS)
|
||||
|
||||
XDIFF_OBJS=xdiff/xdiffi.o xdiff/xprepare.o xdiff/xutils.o xdiff/xemit.o
|
||||
|
||||
$(XDIFF_LIB): $(XDIFF_OBJS)
|
||||
$(AR) rcs $@ $(XDIFF_OBJS)
|
||||
rm -f $@ && $(AR) rcs $@ $(XDIFF_OBJS)
|
||||
|
||||
|
||||
doc:
|
||||
|
@ -3,6 +3,7 @@
|
||||
*
|
||||
* Builtin help-related commands (help, usage, version)
|
||||
*/
|
||||
#include <sys/ioctl.h>
|
||||
#include "cache.h"
|
||||
#include "builtin.h"
|
||||
#include "exec_cmd.h"
|
||||
|
1
cache.h
1
cache.h
@ -134,6 +134,7 @@ extern const char *setup_git_directory_gently(int *);
|
||||
extern const char *setup_git_directory(void);
|
||||
extern const char *prefix_path(const char *prefix, int len, const char *path);
|
||||
extern const char *prefix_filename(const char *prefix, int len, const char *path);
|
||||
extern void verify_filename(const char *prefix, const char *name);
|
||||
|
||||
#define alloc_nr(x) (((x)+16)*3/2)
|
||||
|
||||
|
@ -45,14 +45,13 @@ static void add_buffer(char **bufp, unsigned int *sizep, const char *fmt, ...)
|
||||
|
||||
static void check_valid(unsigned char *sha1, const char *expect)
|
||||
{
|
||||
void *buf;
|
||||
char type[20];
|
||||
unsigned long size;
|
||||
|
||||
buf = read_sha1_file(sha1, type, &size);
|
||||
if (!buf || strcmp(type, expect))
|
||||
die("%s is not a valid '%s' object", sha1_to_hex(sha1), expect);
|
||||
free(buf);
|
||||
if (sha1_object_info(sha1, type, NULL))
|
||||
die("%s is not a valid object", sha1_to_hex(sha1));
|
||||
if (expect && strcmp(type, expect))
|
||||
die("%s is not a valid '%s' object", sha1_to_hex(sha1),
|
||||
expect);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -92,7 +91,7 @@ int main(int argc, char **argv)
|
||||
|
||||
git_config(git_default_config);
|
||||
|
||||
if (argc < 2 || get_sha1_hex(argv[1], tree_sha1) < 0)
|
||||
if (argc < 2 || get_sha1(argv[1], tree_sha1) < 0)
|
||||
usage(commit_tree_usage);
|
||||
|
||||
check_valid(tree_sha1, tree_type);
|
||||
|
214
diff-files.c
214
diff-files.c
@ -12,203 +12,43 @@ static const char diff_files_usage[] =
|
||||
"git-diff-files [-q] [-0/-1/2/3 |-c|--cc] [<common diff options>] [<path>...]"
|
||||
COMMON_DIFF_OPTIONS_HELP;
|
||||
|
||||
static struct rev_info rev;
|
||||
static int silent = 0;
|
||||
static int diff_unmerged_stage = 2;
|
||||
static int combine_merges = 0;
|
||||
static int dense_combined_merges = 0;
|
||||
|
||||
static void show_unmerge(const char *path)
|
||||
{
|
||||
diff_unmerge(&rev.diffopt, path);
|
||||
}
|
||||
|
||||
static void show_file(int pfx, struct cache_entry *ce)
|
||||
{
|
||||
diff_addremove(&rev.diffopt, pfx, ntohl(ce->ce_mode),
|
||||
ce->sha1, ce->name, NULL);
|
||||
}
|
||||
|
||||
static void show_modified(int oldmode, int mode,
|
||||
const unsigned char *old_sha1, const unsigned char *sha1,
|
||||
char *path)
|
||||
{
|
||||
diff_change(&rev.diffopt, oldmode, mode, old_sha1, sha1, path, NULL);
|
||||
}
|
||||
|
||||
int main(int argc, const char **argv)
|
||||
{
|
||||
const char **pathspec;
|
||||
const char *prefix = setup_git_directory();
|
||||
int entries, i;
|
||||
struct rev_info rev;
|
||||
int silent = 0;
|
||||
|
||||
git_config(git_diff_config);
|
||||
diff_setup(&rev.diffopt);
|
||||
init_revisions(&rev);
|
||||
rev.abbrev = 0;
|
||||
|
||||
argc = setup_revisions(argc, argv, &rev, NULL);
|
||||
while (1 < argc && argv[1][0] == '-') {
|
||||
if (!strcmp(argv[1], "--")) {
|
||||
argv++;
|
||||
argc--;
|
||||
break;
|
||||
}
|
||||
if (!strcmp(argv[1], "-0"))
|
||||
diff_unmerged_stage = 0;
|
||||
else if (!strcmp(argv[1], "-1"))
|
||||
diff_unmerged_stage = 1;
|
||||
else if (!strcmp(argv[1], "-2"))
|
||||
diff_unmerged_stage = 2;
|
||||
else if (!strcmp(argv[1], "-3"))
|
||||
diff_unmerged_stage = 3;
|
||||
else if (!strcmp(argv[1], "--base"))
|
||||
diff_unmerged_stage = 1;
|
||||
if (!strcmp(argv[1], "--base"))
|
||||
rev.max_count = 1;
|
||||
else if (!strcmp(argv[1], "--ours"))
|
||||
diff_unmerged_stage = 2;
|
||||
rev.max_count = 2;
|
||||
else if (!strcmp(argv[1], "--theirs"))
|
||||
diff_unmerged_stage = 3;
|
||||
rev.max_count = 3;
|
||||
else if (!strcmp(argv[1], "-q"))
|
||||
silent = 1;
|
||||
else if (!strcmp(argv[1], "-r"))
|
||||
; /* no-op */
|
||||
else if (!strcmp(argv[1], "-s"))
|
||||
; /* no-op */
|
||||
else if (!strcmp(argv[1], "-c"))
|
||||
combine_merges = 1;
|
||||
else if (!strcmp(argv[1], "--cc"))
|
||||
dense_combined_merges = combine_merges = 1;
|
||||
else {
|
||||
int diff_opt_cnt;
|
||||
diff_opt_cnt = diff_opt_parse(&rev.diffopt,
|
||||
argv+1, argc-1);
|
||||
if (diff_opt_cnt < 0)
|
||||
usage(diff_files_usage);
|
||||
else if (diff_opt_cnt) {
|
||||
argv += diff_opt_cnt;
|
||||
argc -= diff_opt_cnt;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
usage(diff_files_usage);
|
||||
}
|
||||
else
|
||||
usage(diff_files_usage);
|
||||
argv++; argc--;
|
||||
}
|
||||
if (dense_combined_merges)
|
||||
rev.diffopt.output_format = DIFF_FORMAT_PATCH;
|
||||
|
||||
/* Find the directory, and set up the pathspec */
|
||||
pathspec = get_pathspec(prefix, argv + 1);
|
||||
entries = read_cache();
|
||||
|
||||
if (diff_setup_done(&rev.diffopt) < 0)
|
||||
usage(diff_files_usage);
|
||||
|
||||
/* At this point, if argc == 1, then we are doing everything.
|
||||
* Otherwise argv[1] .. argv[argc-1] have the explicit paths.
|
||||
/*
|
||||
* Make sure there are NO revision (i.e. pending object) parameter,
|
||||
* rev.max_count is reasonable (0 <= n <= 3),
|
||||
* there is no other revision filtering parameters.
|
||||
*/
|
||||
if (entries < 0) {
|
||||
perror("read_cache");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
for (i = 0; i < entries; i++) {
|
||||
struct stat st;
|
||||
unsigned int oldmode, newmode;
|
||||
struct cache_entry *ce = active_cache[i];
|
||||
int changed;
|
||||
|
||||
if (!ce_path_match(ce, pathspec))
|
||||
continue;
|
||||
|
||||
if (ce_stage(ce)) {
|
||||
struct {
|
||||
struct combine_diff_path p;
|
||||
struct combine_diff_parent filler[5];
|
||||
} combine;
|
||||
int num_compare_stages = 0;
|
||||
|
||||
combine.p.next = NULL;
|
||||
combine.p.len = ce_namelen(ce);
|
||||
combine.p.path = xmalloc(combine.p.len + 1);
|
||||
memcpy(combine.p.path, ce->name, combine.p.len);
|
||||
combine.p.path[combine.p.len] = 0;
|
||||
combine.p.mode = 0;
|
||||
memset(combine.p.sha1, 0, 20);
|
||||
memset(&combine.p.parent[0], 0,
|
||||
sizeof(combine.filler));
|
||||
|
||||
while (i < entries) {
|
||||
struct cache_entry *nce = active_cache[i];
|
||||
int stage;
|
||||
|
||||
if (strcmp(ce->name, nce->name))
|
||||
break;
|
||||
|
||||
/* Stage #2 (ours) is the first parent,
|
||||
* stage #3 (theirs) is the second.
|
||||
*/
|
||||
stage = ce_stage(nce);
|
||||
if (2 <= stage) {
|
||||
int mode = ntohl(nce->ce_mode);
|
||||
num_compare_stages++;
|
||||
memcpy(combine.p.parent[stage-2].sha1,
|
||||
nce->sha1, 20);
|
||||
combine.p.parent[stage-2].mode =
|
||||
canon_mode(mode);
|
||||
combine.p.parent[stage-2].status =
|
||||
DIFF_STATUS_MODIFIED;
|
||||
}
|
||||
|
||||
/* diff against the proper unmerged stage */
|
||||
if (stage == diff_unmerged_stage)
|
||||
ce = nce;
|
||||
i++;
|
||||
}
|
||||
/*
|
||||
* Compensate for loop update
|
||||
*/
|
||||
i--;
|
||||
|
||||
if (combine_merges && num_compare_stages == 2) {
|
||||
show_combined_diff(&combine.p, 2,
|
||||
dense_combined_merges,
|
||||
&rev);
|
||||
free(combine.p.path);
|
||||
continue;
|
||||
}
|
||||
free(combine.p.path);
|
||||
|
||||
/*
|
||||
* Show the diff for the 'ce' if we found the one
|
||||
* from the desired stage.
|
||||
*/
|
||||
show_unmerge(ce->name);
|
||||
if (ce_stage(ce) != diff_unmerged_stage)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (lstat(ce->name, &st) < 0) {
|
||||
if (errno != ENOENT && errno != ENOTDIR) {
|
||||
perror(ce->name);
|
||||
continue;
|
||||
}
|
||||
if (silent)
|
||||
continue;
|
||||
show_file('-', ce);
|
||||
continue;
|
||||
}
|
||||
changed = ce_match_stat(ce, &st, 0);
|
||||
if (!changed && !rev.diffopt.find_copies_harder)
|
||||
continue;
|
||||
oldmode = ntohl(ce->ce_mode);
|
||||
|
||||
newmode = canon_mode(st.st_mode);
|
||||
if (!trust_executable_bit &&
|
||||
S_ISREG(newmode) && S_ISREG(oldmode) &&
|
||||
((newmode ^ oldmode) == 0111))
|
||||
newmode = oldmode;
|
||||
show_modified(oldmode, newmode,
|
||||
ce->sha1, (changed ? null_sha1 : ce->sha1),
|
||||
ce->name);
|
||||
}
|
||||
diffcore_std(&rev.diffopt);
|
||||
diff_flush(&rev.diffopt);
|
||||
return 0;
|
||||
if (rev.pending_objects ||
|
||||
rev.min_age != -1 || rev.max_age != -1)
|
||||
usage(diff_files_usage);
|
||||
/*
|
||||
* Backward compatibility wart - "diff-files -s" used to
|
||||
* defeat the common diff option "-s" which asked for
|
||||
* DIFF_FORMAT_NO_OUTPUT.
|
||||
*/
|
||||
if (rev.diffopt.output_format == DIFF_FORMAT_NO_OUTPUT)
|
||||
rev.diffopt.output_format = DIFF_FORMAT_RAW;
|
||||
return run_diff_files(&rev, silent);
|
||||
}
|
||||
|
251
diff-index.c
251
diff-index.c
@ -1,166 +1,7 @@
|
||||
#include "cache.h"
|
||||
#include "tree.h"
|
||||
#include "diff.h"
|
||||
|
||||
static int cached_only = 0;
|
||||
static int match_nonexisting = 0;
|
||||
static struct diff_options diff_options;
|
||||
|
||||
/* A file entry went away or appeared */
|
||||
static void show_file(const char *prefix,
|
||||
struct cache_entry *ce,
|
||||
unsigned char *sha1, unsigned int mode)
|
||||
{
|
||||
diff_addremove(&diff_options, prefix[0], ntohl(mode),
|
||||
sha1, ce->name, NULL);
|
||||
}
|
||||
|
||||
static int get_stat_data(struct cache_entry *ce,
|
||||
unsigned char ** sha1p, unsigned int *modep)
|
||||
{
|
||||
unsigned char *sha1 = ce->sha1;
|
||||
unsigned int mode = ce->ce_mode;
|
||||
|
||||
if (!cached_only) {
|
||||
static unsigned char no_sha1[20];
|
||||
int changed;
|
||||
struct stat st;
|
||||
if (lstat(ce->name, &st) < 0) {
|
||||
if (errno == ENOENT && match_nonexisting) {
|
||||
*sha1p = sha1;
|
||||
*modep = mode;
|
||||
return 0;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
changed = ce_match_stat(ce, &st, 0);
|
||||
if (changed) {
|
||||
mode = create_ce_mode(st.st_mode);
|
||||
if (!trust_executable_bit && S_ISREG(st.st_mode))
|
||||
mode = ce->ce_mode;
|
||||
sha1 = no_sha1;
|
||||
}
|
||||
}
|
||||
|
||||
*sha1p = sha1;
|
||||
*modep = mode;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void show_new_file(struct cache_entry *new)
|
||||
{
|
||||
unsigned char *sha1;
|
||||
unsigned int mode;
|
||||
|
||||
/* New file in the index: it might actually be different in
|
||||
* the working copy.
|
||||
*/
|
||||
if (get_stat_data(new, &sha1, &mode) < 0)
|
||||
return;
|
||||
|
||||
show_file("+", new, sha1, mode);
|
||||
}
|
||||
|
||||
static int show_modified(struct cache_entry *old,
|
||||
struct cache_entry *new,
|
||||
int report_missing)
|
||||
{
|
||||
unsigned int mode, oldmode;
|
||||
unsigned char *sha1;
|
||||
|
||||
if (get_stat_data(new, &sha1, &mode) < 0) {
|
||||
if (report_missing)
|
||||
show_file("-", old, old->sha1, old->ce_mode);
|
||||
return -1;
|
||||
}
|
||||
|
||||
oldmode = old->ce_mode;
|
||||
if (mode == oldmode && !memcmp(sha1, old->sha1, 20) &&
|
||||
!diff_options.find_copies_harder)
|
||||
return 0;
|
||||
|
||||
mode = ntohl(mode);
|
||||
oldmode = ntohl(oldmode);
|
||||
|
||||
diff_change(&diff_options, oldmode, mode,
|
||||
old->sha1, sha1, old->name, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int diff_cache(struct cache_entry **ac, int entries, const char **pathspec)
|
||||
{
|
||||
while (entries) {
|
||||
struct cache_entry *ce = *ac;
|
||||
int same = (entries > 1) && ce_same_name(ce, ac[1]);
|
||||
|
||||
if (!ce_path_match(ce, pathspec))
|
||||
goto skip_entry;
|
||||
|
||||
switch (ce_stage(ce)) {
|
||||
case 0:
|
||||
/* No stage 1 entry? That means it's a new file */
|
||||
if (!same) {
|
||||
show_new_file(ce);
|
||||
break;
|
||||
}
|
||||
/* Show difference between old and new */
|
||||
show_modified(ac[1], ce, 1);
|
||||
break;
|
||||
case 1:
|
||||
/* No stage 3 (merge) entry? That means it's been deleted */
|
||||
if (!same) {
|
||||
show_file("-", ce, ce->sha1, ce->ce_mode);
|
||||
break;
|
||||
}
|
||||
/* We come here with ce pointing at stage 1
|
||||
* (original tree) and ac[1] pointing at stage
|
||||
* 3 (unmerged). show-modified with
|
||||
* report-missing set to false does not say the
|
||||
* file is deleted but reports true if work
|
||||
* tree does not have it, in which case we
|
||||
* fall through to report the unmerged state.
|
||||
* Otherwise, we show the differences between
|
||||
* the original tree and the work tree.
|
||||
*/
|
||||
if (!cached_only && !show_modified(ce, ac[1], 0))
|
||||
break;
|
||||
/* fallthru */
|
||||
case 3:
|
||||
diff_unmerge(&diff_options, ce->name);
|
||||
break;
|
||||
|
||||
default:
|
||||
die("impossible cache entry stage");
|
||||
}
|
||||
|
||||
skip_entry:
|
||||
/*
|
||||
* Ignore all the different stages for this file,
|
||||
* we've handled the relevant cases now.
|
||||
*/
|
||||
do {
|
||||
ac++;
|
||||
entries--;
|
||||
} while (entries && ce_same_name(ce, ac[0]));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* This turns all merge entries into "stage 3". That guarantees that
|
||||
* when we read in the new tree (into "stage 1"), we won't lose sight
|
||||
* of the fact that we had unmerged entries.
|
||||
*/
|
||||
static void mark_merge_entries(void)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < active_nr; i++) {
|
||||
struct cache_entry *ce = active_cache[i];
|
||||
if (!ce_stage(ce))
|
||||
continue;
|
||||
ce->ce_flags |= htons(CE_STAGEMASK);
|
||||
}
|
||||
}
|
||||
#include "commit.h"
|
||||
#include "revision.h"
|
||||
|
||||
static const char diff_cache_usage[] =
|
||||
"git-diff-index [-m] [--cached] "
|
||||
@ -169,85 +10,29 @@ COMMON_DIFF_OPTIONS_HELP;
|
||||
|
||||
int main(int argc, const char **argv)
|
||||
{
|
||||
const char *tree_name = NULL;
|
||||
unsigned char sha1[20];
|
||||
const char *prefix = setup_git_directory();
|
||||
const char **pathspec = NULL;
|
||||
struct tree *tree;
|
||||
int ret;
|
||||
int allow_options = 1;
|
||||
struct rev_info rev;
|
||||
int cached = 0;
|
||||
int i;
|
||||
|
||||
git_config(git_diff_config);
|
||||
diff_setup(&diff_options);
|
||||
init_revisions(&rev);
|
||||
rev.abbrev = 0;
|
||||
|
||||
argc = setup_revisions(argc, argv, &rev, NULL);
|
||||
for (i = 1; i < argc; i++) {
|
||||
const char *arg = argv[i];
|
||||
int diff_opt_cnt;
|
||||
|
||||
if (!allow_options || *arg != '-') {
|
||||
if (tree_name)
|
||||
break;
|
||||
tree_name = arg;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!strcmp(arg, "--")) {
|
||||
allow_options = 0;
|
||||
continue;
|
||||
}
|
||||
if (!strcmp(arg, "-r")) {
|
||||
/* We accept the -r flag just to look like git-diff-tree */
|
||||
continue;
|
||||
}
|
||||
if (!strcmp(arg, "--cc"))
|
||||
/*
|
||||
* I _think_ "diff-index --cached HEAD" with an
|
||||
* unmerged index could show something else
|
||||
* later, but pretend --cc is the same as -p for
|
||||
* now. "git diff" uses --cc by default.
|
||||
*/
|
||||
argv[i] = arg = "-p";
|
||||
diff_opt_cnt = diff_opt_parse(&diff_options, argv + i,
|
||||
argc - i);
|
||||
if (diff_opt_cnt < 0)
|
||||
if (!strcmp(arg, "--cached"))
|
||||
cached = 1;
|
||||
else
|
||||
usage(diff_cache_usage);
|
||||
else if (diff_opt_cnt) {
|
||||
i += diff_opt_cnt - 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!strcmp(arg, "-m")) {
|
||||
match_nonexisting = 1;
|
||||
continue;
|
||||
}
|
||||
if (!strcmp(arg, "--cached")) {
|
||||
cached_only = 1;
|
||||
continue;
|
||||
}
|
||||
usage(diff_cache_usage);
|
||||
}
|
||||
|
||||
pathspec = get_pathspec(prefix, argv + i);
|
||||
|
||||
if (diff_setup_done(&diff_options) < 0)
|
||||
/*
|
||||
* Make sure there is one revision (i.e. pending object),
|
||||
* and there is no revision filtering parameters.
|
||||
*/
|
||||
if (!rev.pending_objects || rev.pending_objects->next ||
|
||||
rev.max_count != -1 || rev.min_age != -1 || rev.max_age != -1)
|
||||
usage(diff_cache_usage);
|
||||
|
||||
if (!tree_name || get_sha1(tree_name, sha1))
|
||||
usage(diff_cache_usage);
|
||||
|
||||
read_cache();
|
||||
|
||||
mark_merge_entries();
|
||||
|
||||
tree = parse_tree_indirect(sha1);
|
||||
if (!tree)
|
||||
die("bad tree object %s", tree_name);
|
||||
if (read_tree(tree, 1, pathspec))
|
||||
die("unable to read tree object %s", tree_name);
|
||||
|
||||
ret = diff_cache(active_cache, active_nr, pathspec);
|
||||
|
||||
diffcore_std(&diff_options);
|
||||
diff_flush(&diff_options);
|
||||
return ret;
|
||||
return run_diff_index(&rev, cached);
|
||||
}
|
||||
|
2017
diff-lib.c
2017
diff-lib.c
File diff suppressed because it is too large
Load Diff
9
diff.h
9
diff.h
@ -28,10 +28,11 @@ struct diff_options {
|
||||
with_raw:1,
|
||||
with_stat:1,
|
||||
tree_in_recursive:1,
|
||||
full_index:1;
|
||||
full_index:1,
|
||||
silent_on_remove:1,
|
||||
find_copies_harder:1;
|
||||
int break_opt;
|
||||
int detect_rename;
|
||||
int find_copies_harder;
|
||||
int line_termination;
|
||||
int output_format;
|
||||
int pickaxe_opts;
|
||||
@ -168,4 +169,8 @@ extern void diff_flush(struct diff_options*);
|
||||
|
||||
extern const char *diff_unique_abbrev(const unsigned char *, int);
|
||||
|
||||
extern int run_diff_files(struct rev_info *revs, int silent_on_removed);
|
||||
|
||||
extern int run_diff_index(struct rev_info *revs, int cached);
|
||||
|
||||
#endif /* DIFF_H */
|
||||
|
@ -376,6 +376,13 @@ do
|
||||
echo "No changes - did you forget update-index?"
|
||||
stop_here $this
|
||||
fi
|
||||
unmerged=$(git-ls-files -u)
|
||||
if test -n "$unmerged"
|
||||
then
|
||||
echo "You still have unmerged paths in your index"
|
||||
echo "did you forget update-index?"
|
||||
stop_here $this
|
||||
fi
|
||||
apply_status=0
|
||||
;;
|
||||
esac
|
||||
|
@ -10,9 +10,10 @@ use warnings;
|
||||
use strict;
|
||||
use Getopt::Long;
|
||||
use POSIX qw(strftime gmtime);
|
||||
use File::Basename qw(basename dirname);
|
||||
|
||||
sub usage() {
|
||||
print STDERR 'Usage: ${\basename $0} [-s] [-S revs-file] file [ revision ]
|
||||
print STDERR "Usage: ${\basename $0} [-s] [-S revs-file] file [ revision ]
|
||||
-l, --long
|
||||
Show long rev (Defaults off)
|
||||
-t, --time
|
||||
@ -23,7 +24,7 @@ sub usage() {
|
||||
Use revs from revs-file instead of calling git-rev-list
|
||||
-h, --help
|
||||
This message.
|
||||
';
|
||||
";
|
||||
|
||||
exit(1);
|
||||
}
|
||||
@ -35,7 +36,7 @@ my $rc = GetOptions( "long|l" => \$longrev,
|
||||
"help|h" => \$help,
|
||||
"rename|r" => \$rename,
|
||||
"rev-file|S=s" => \$rev_file);
|
||||
if (!$rc or $help) {
|
||||
if (!$rc or $help or !@ARGV) {
|
||||
usage();
|
||||
}
|
||||
|
||||
@ -208,6 +209,9 @@ sub find_parent_renames {
|
||||
while (my $change = <$patch>) {
|
||||
chomp $change;
|
||||
my $filename = <$patch>;
|
||||
if (!defined $filename) {
|
||||
next;
|
||||
}
|
||||
chomp $filename;
|
||||
|
||||
if ($change =~ m/^[AMD]$/ ) {
|
||||
|
@ -1,6 +1,6 @@
|
||||
#!/bin/sh
|
||||
|
||||
USAGE='[(-d | -D) <branchname>] | [[-f] <branchname> [<start-point>]]'
|
||||
USAGE='[(-d | -D) <branchname>] | [[-f] <branchname> [<start-point>]] | -r'
|
||||
LONG_USAGE='If no arguments, show available branches and mark current branch with a star.
|
||||
If one argument, create a new branch <branchname> based off of current HEAD.
|
||||
If two arguments, create a new branch <branchname> based off of <start-point>.'
|
||||
|
@ -88,7 +88,7 @@ my $TEMP_DIR = tempdir( CLEANUP => 1 );
|
||||
$log->debug("Temporary directory is '$TEMP_DIR'");
|
||||
|
||||
# if we are called with a pserver argument,
|
||||
# deal with the authentication cat before entereing the
|
||||
# deal with the authentication cat before entering the
|
||||
# main loop
|
||||
if (@ARGV && $ARGV[0] eq 'pserver') {
|
||||
my $line = <STDIN>; chomp $line;
|
||||
@ -117,7 +117,7 @@ while (<STDIN>)
|
||||
{
|
||||
chomp;
|
||||
|
||||
# Check to see if we've seen this method, and call appropiate function.
|
||||
# Check to see if we've seen this method, and call appropriate function.
|
||||
if ( /^([\w-]+)(?:\s+(.*))?$/ and defined($methods->{$1}) )
|
||||
{
|
||||
# use the $methods hash to call the appropriate sub for this command
|
||||
@ -171,11 +171,11 @@ sub req_Root
|
||||
return 0;
|
||||
}
|
||||
|
||||
my @gitvars = `git-var -l`;
|
||||
my @gitvars = `git-repo-config -l`;
|
||||
if ($?) {
|
||||
print "E problems executing git-var on the server -- this is not a git repository or the PATH is not set correcly.\n";
|
||||
print "E problems executing git-repo-config on the server -- this is not a git repository or the PATH is not set correctly.\n";
|
||||
print "E \n";
|
||||
print "error 1 - problem executing git-var\n";
|
||||
print "error 1 - problem executing git-repo-config\n";
|
||||
return 0;
|
||||
}
|
||||
foreach my $line ( @gitvars )
|
||||
@ -224,7 +224,7 @@ sub req_Globaloption
|
||||
sub req_Validresponses
|
||||
{
|
||||
my ( $cmd, $data ) = @_;
|
||||
$log->debug("req_Validrepsonses : $data");
|
||||
$log->debug("req_Validresponses : $data");
|
||||
|
||||
# TODO : re-enable this, currently it's not particularly useful
|
||||
#$state->{validresponses} = [ split /\s+/, $data ];
|
||||
@ -733,7 +733,7 @@ sub req_update
|
||||
argsplit("update");
|
||||
|
||||
#
|
||||
# It may just be a client exploring the available heads/modukles
|
||||
# It may just be a client exploring the available heads/modules
|
||||
# in that case, list them as top level directories and leave it
|
||||
# at that. Eclipse uses this technique to offer you a list of
|
||||
# projects (heads in this case) to checkout.
|
||||
@ -1731,7 +1731,7 @@ sub transmitfile
|
||||
}
|
||||
|
||||
# This method takes a file name, and returns ( $dirpart, $filepart ) which
|
||||
# refers to the directory porition and the file portion of the filename
|
||||
# refers to the directory portion and the file portion of the filename
|
||||
# respectively
|
||||
sub filenamesplit
|
||||
{
|
||||
@ -1790,7 +1790,7 @@ Log::Log4perl
|
||||
=head2 new
|
||||
|
||||
Creates a new log object, optionally you can specify a filename here to
|
||||
indicate the file to log to. If no log file is specified, you can specifiy one
|
||||
indicate the file to log to. If no log file is specified, you can specify one
|
||||
later with method setfile, or indicate you no longer want logging with method
|
||||
nofile.
|
||||
|
||||
@ -2595,7 +2595,7 @@ sub in_array
|
||||
|
||||
=head2 safe_pipe_capture
|
||||
|
||||
an alterative to `command` that allows input to be passed as an array
|
||||
an alternative to `command` that allows input to be passed as an array
|
||||
to work around shell problems with weird characters in arguments
|
||||
|
||||
=cut
|
||||
|
@ -205,11 +205,10 @@ sub show_date {
|
||||
}
|
||||
my $t = $time + $minutes * 60;
|
||||
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday) = gmtime($t);
|
||||
return sprintf("%s %s %d %02d:%02d:%02d %d %+05d",
|
||||
$weekday_names[$wday],
|
||||
$month_names[$mon],
|
||||
$mday, $hour, $min, $sec,
|
||||
$year+1900, $tz);
|
||||
return sprintf("%s, %d %s %d %02d:%02d:%02d %+05d",
|
||||
$weekday_names[$wday], $mday,
|
||||
$month_names[$mon], $year+1900,
|
||||
$hour, $min, $sec, $tz);
|
||||
}
|
||||
|
||||
print "From nobody Mon Sep 17 00:00:00 2001\n";
|
||||
|
@ -107,7 +107,7 @@ onto=$(git-rev-parse --verify "${onto_name}^0") || exit
|
||||
|
||||
# Check if we are already based on $onto, but this should be
|
||||
# done only when upstream and onto are the same.
|
||||
if test "$upstream" = "onto"
|
||||
if test "$upstream" = "$onto"
|
||||
then
|
||||
mb=$(git-merge-base "$onto" "$branch")
|
||||
if test "$mb" = "$onto"
|
||||
|
1
git.c
1
git.c
@ -8,7 +8,6 @@
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
#include <stdarg.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include "git-compat-util.h"
|
||||
#include "exec_cmd.h"
|
||||
|
||||
|
@ -29,12 +29,12 @@ static int verify_packfile(struct packed_git *p)
|
||||
pack_base = p->pack_base;
|
||||
SHA1_Update(&ctx, pack_base, pack_size - 20);
|
||||
SHA1_Final(sha1, &ctx);
|
||||
if (memcmp(sha1, index_base + index_size - 40, 20))
|
||||
return error("Packfile %s SHA1 mismatch with idx",
|
||||
p->pack_name);
|
||||
if (memcmp(sha1, pack_base + pack_size - 20, 20))
|
||||
return error("Packfile %s SHA1 mismatch with itself",
|
||||
p->pack_name);
|
||||
if (memcmp(sha1, index_base + index_size - 40, 20))
|
||||
return error("Packfile %s SHA1 mismatch with idx",
|
||||
p->pack_name);
|
||||
|
||||
/* Make sure everything reachable from idx is valid. Since we
|
||||
* have verified that nr_objects matches between idx and pack,
|
||||
|
@ -2,7 +2,7 @@
|
||||
#include <regex.h>
|
||||
|
||||
static const char git_config_set_usage[] =
|
||||
"git-repo-config [ --bool | --int ] [--get | --get-all | --replace-all | --unset | --unset-all] name [value [value_regex]]";
|
||||
"git-repo-config [ --bool | --int ] [--get | --get-all | --replace-all | --unset | --unset-all] name [value [value_regex]] | --list";
|
||||
|
||||
static char* key = NULL;
|
||||
static char* value = NULL;
|
||||
@ -12,6 +12,15 @@ static int do_not_match = 0;
|
||||
static int seen = 0;
|
||||
static enum { T_RAW, T_INT, T_BOOL } type = T_RAW;
|
||||
|
||||
static int show_all_config(const char *key_, const char *value_)
|
||||
{
|
||||
if (value_)
|
||||
printf("%s=%s\n", key_, value_);
|
||||
else
|
||||
printf("%s\n", key_);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int show_config(const char* key_, const char* value_)
|
||||
{
|
||||
if (value_ == NULL)
|
||||
@ -67,7 +76,7 @@ static int get_value(const char* key_, const char* regex_)
|
||||
}
|
||||
}
|
||||
|
||||
i = git_config(show_config);
|
||||
git_config(show_config);
|
||||
if (value) {
|
||||
printf("%s\n", value);
|
||||
free(value);
|
||||
@ -99,6 +108,9 @@ int main(int argc, const char **argv)
|
||||
argv++;
|
||||
}
|
||||
|
||||
if (!strcmp(argv[1], "--list") || !strcmp(argv[1], "-l"))
|
||||
return git_config(show_all_config);
|
||||
|
||||
switch (argc) {
|
||||
case 2:
|
||||
return get_value(argv[1], NULL);
|
||||
|
15
rev-parse.c
15
rev-parse.c
@ -160,14 +160,6 @@ static int show_file(const char *arg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void die_badfile(const char *arg)
|
||||
{
|
||||
if (errno != ENOENT)
|
||||
die("'%s': %s", arg, strerror(errno));
|
||||
die("'%s' is ambiguous - revision name or file/directory name?\n"
|
||||
"Please put '--' before the list of filenames.", arg);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int i, as_is = 0, verify = 0;
|
||||
@ -177,14 +169,12 @@ int main(int argc, char **argv)
|
||||
git_config(git_default_config);
|
||||
|
||||
for (i = 1; i < argc; i++) {
|
||||
struct stat st;
|
||||
char *arg = argv[i];
|
||||
char *dotdot;
|
||||
|
||||
if (as_is) {
|
||||
if (show_file(arg) && as_is < 2)
|
||||
if (lstat(arg, &st) < 0)
|
||||
die_badfile(arg);
|
||||
verify_filename(prefix, arg);
|
||||
continue;
|
||||
}
|
||||
if (!strcmp(arg,"-n")) {
|
||||
@ -350,8 +340,7 @@ int main(int argc, char **argv)
|
||||
continue;
|
||||
if (verify)
|
||||
die("Needed a single revision");
|
||||
if (lstat(arg, &st) < 0)
|
||||
die_badfile(arg);
|
||||
verify_filename(prefix, arg);
|
||||
}
|
||||
show_default();
|
||||
if (verify && revs_count != 1)
|
||||
|
@ -752,17 +752,15 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch
|
||||
arg++;
|
||||
}
|
||||
if (get_sha1(arg, sha1) < 0) {
|
||||
struct stat st;
|
||||
int j;
|
||||
|
||||
if (seen_dashdash || local_flags)
|
||||
die("bad revision '%s'", arg);
|
||||
|
||||
/* If we didn't have a "--", all filenames must exist */
|
||||
for (j = i; j < argc; j++) {
|
||||
if (lstat(argv[j], &st) < 0)
|
||||
die("'%s': %s", argv[j], strerror(errno));
|
||||
}
|
||||
for (j = i; j < argc; j++)
|
||||
verify_filename(revs->prefix, argv[j]);
|
||||
|
||||
revs->prune_data = get_pathspec(revs->prefix, argv + i);
|
||||
break;
|
||||
}
|
||||
|
23
setup.c
23
setup.c
@ -62,6 +62,29 @@ const char *prefix_filename(const char *pfx, int pfx_len, const char *arg)
|
||||
return path;
|
||||
}
|
||||
|
||||
/*
|
||||
* Verify a filename that we got as an argument for a pathspec
|
||||
* entry. Note that a filename that begins with "-" never verifies
|
||||
* as true, because even if such a filename were to exist, we want
|
||||
* it to be preceded by the "--" marker (or we want the user to
|
||||
* use a format like "./-filename")
|
||||
*/
|
||||
void verify_filename(const char *prefix, const char *arg)
|
||||
{
|
||||
const char *name;
|
||||
struct stat st;
|
||||
|
||||
if (*arg == '-')
|
||||
die("bad flag '%s' used after filename", arg);
|
||||
name = prefix ? prefix_filename(prefix, strlen(prefix), arg) : arg;
|
||||
if (!lstat(name, &st))
|
||||
return;
|
||||
if (errno == ENOENT)
|
||||
die("ambiguous argument '%s': unknown revision or filename\n"
|
||||
"Use '--' to separate filenames from revisions", arg);
|
||||
die("'%s': %s", arg, strerror(errno));
|
||||
}
|
||||
|
||||
const char **get_pathspec(const char *prefix, const char **pathspec)
|
||||
{
|
||||
const char *entry = *pathspec;
|
||||
|
@ -174,6 +174,27 @@ test_expect_success \
|
||||
'git-ls-tree -r output for a known tree.' \
|
||||
'diff current expected'
|
||||
|
||||
# But with -r -t we can have both.
|
||||
test_expect_success \
|
||||
'showing tree with git-ls-tree -r -t' \
|
||||
'git-ls-tree -r -t $tree >current'
|
||||
cat >expected <<\EOF
|
||||
100644 blob f87290f8eb2cbbea7857214459a0739927eab154 path0
|
||||
120000 blob 15a98433ae33114b085f3eb3bb03b832b3180a01 path0sym
|
||||
040000 tree 58a09c23e2ca152193f2786e06986b7b6712bdbe path2
|
||||
100644 blob 3feff949ed00a62d9f7af97c15cd8a30595e7ac7 path2/file2
|
||||
120000 blob d8ce161addc5173867a3c3c730924388daedbc38 path2/file2sym
|
||||
040000 tree 21ae8269cacbe57ae09138dcc3a2887f904d02b3 path3
|
||||
100644 blob 0aa34cae68d0878578ad119c86ca2b5ed5b28376 path3/file3
|
||||
120000 blob 8599103969b43aff7e430efea79ca4636466794f path3/file3sym
|
||||
040000 tree 3c5e5399f3a333eddecce7a9b9465b63f65f51e2 path3/subp3
|
||||
100644 blob 00fb5908cb97c2564a9783c0c64087333b3b464f path3/subp3/file3
|
||||
120000 blob 6649a1ebe9e9f1c553b66f5a6e74136a07ccc57c path3/subp3/file3sym
|
||||
EOF
|
||||
test_expect_success \
|
||||
'git-ls-tree -r output for a known tree.' \
|
||||
'diff current expected'
|
||||
|
||||
################################################################
|
||||
rm .git/index
|
||||
test_expect_success \
|
||||
@ -205,4 +226,32 @@ test_expect_success \
|
||||
'no diff after checkout and git-update-index --refresh.' \
|
||||
'git-diff-files >current && cmp -s current /dev/null'
|
||||
|
||||
################################################################
|
||||
P=087704a96baf1c2d1c869a8b084481e121c88b5b
|
||||
test_expect_success \
|
||||
'git-commit-tree records the correct tree in a commit.' \
|
||||
'commit0=$(echo NO | git-commit-tree $P) &&
|
||||
tree=$(git show --pretty=raw $commit0 |
|
||||
sed -n -e "s/^tree //p" -e "/^author /q") &&
|
||||
test "z$tree" = "z$P"'
|
||||
|
||||
test_expect_success \
|
||||
'git-commit-tree records the correct parent in a commit.' \
|
||||
'commit1=$(echo NO | git-commit-tree $P -p $commit0) &&
|
||||
parent=$(git show --pretty=raw $commit1 |
|
||||
sed -n -e "s/^parent //p" -e "/^author /q") &&
|
||||
test "z$commit0" = "z$parent"'
|
||||
|
||||
test_expect_success \
|
||||
'git-commit-tree omits duplicated parent in a commit.' \
|
||||
'commit2=$(echo NO | git-commit-tree $P -p $commit0 -p $commit0) &&
|
||||
parent=$(git show --pretty=raw $commit2 |
|
||||
sed -n -e "s/^parent //p" -e "/^author /q" |
|
||||
sort -u) &&
|
||||
test "z$commit0" = "z$parent" &&
|
||||
numparent=$(git show --pretty=raw $commit2 |
|
||||
sed -n -e "s/^parent //p" -e "/^author /q" |
|
||||
wc -l) &&
|
||||
test $numparent = 1'
|
||||
|
||||
test_done
|
||||
|
@ -37,7 +37,7 @@ compare_change () {
|
||||
}
|
||||
|
||||
check_cache_at () {
|
||||
clean_if_empty=`git-diff-files "$1"`
|
||||
clean_if_empty=`git-diff-files -- "$1"`
|
||||
case "$clean_if_empty" in
|
||||
'') echo "$1: clean" ;;
|
||||
?*) echo "$1: dirty" ;;
|
||||
|
@ -20,7 +20,7 @@ compare_change () {
|
||||
}
|
||||
|
||||
check_cache_at () {
|
||||
clean_if_empty=`git-diff-files "$1"`
|
||||
clean_if_empty=`git-diff-files -- "$1"`
|
||||
case "$clean_if_empty" in
|
||||
'') echo "$1: clean" ;;
|
||||
?*) echo "$1: dirty" ;;
|
||||
|
@ -28,7 +28,7 @@ cat >expected <<\EOF
|
||||
EOF
|
||||
test_expect_success \
|
||||
'limit to path should show nothing' \
|
||||
'git-diff-index --cached $tree path >current &&
|
||||
'git-diff-index --cached $tree -- path >current &&
|
||||
compare_diff_raw current expected'
|
||||
|
||||
cat >expected <<\EOF
|
||||
@ -36,7 +36,7 @@ cat >expected <<\EOF
|
||||
EOF
|
||||
test_expect_success \
|
||||
'limit to path1 should show path1/file1' \
|
||||
'git-diff-index --cached $tree path1 >current &&
|
||||
'git-diff-index --cached $tree -- path1 >current &&
|
||||
compare_diff_raw current expected'
|
||||
|
||||
cat >expected <<\EOF
|
||||
@ -44,7 +44,7 @@ cat >expected <<\EOF
|
||||
EOF
|
||||
test_expect_success \
|
||||
'limit to path1/ should show path1/file1' \
|
||||
'git-diff-index --cached $tree path1/ >current &&
|
||||
'git-diff-index --cached $tree -- path1/ >current &&
|
||||
compare_diff_raw current expected'
|
||||
|
||||
cat >expected <<\EOF
|
||||
@ -52,14 +52,14 @@ cat >expected <<\EOF
|
||||
EOF
|
||||
test_expect_success \
|
||||
'limit to file0 should show file0' \
|
||||
'git-diff-index --cached $tree file0 >current &&
|
||||
'git-diff-index --cached $tree -- file0 >current &&
|
||||
compare_diff_raw current expected'
|
||||
|
||||
cat >expected <<\EOF
|
||||
EOF
|
||||
test_expect_success \
|
||||
'limit to file0/ should emit nothing.' \
|
||||
'git-diff-index --cached $tree file0/ >current &&
|
||||
'git-diff-index --cached $tree -- file0/ >current &&
|
||||
compare_diff_raw current expected'
|
||||
|
||||
test_done
|
||||
|
Loading…
Reference in New Issue
Block a user