From: "Shawn O. Pearce" <spearce@spearce.org>
To: Junio C Hamano <junkio@cox.net>
Cc: git@vger.kernel.org
Subject: [PATCH 2/2] Optionally check for uncommitted changes before switching branches.
Date: Thu, 7 Dec 2006 05:02:24 -0500 [thread overview]
Message-ID: <20061207100224.GB12966@spearce.org> (raw)
In-Reply-To: <6ed9774cb95e873e76a4ac406dd740caf954bd3b.1165485618.git.spearce@spearce.org>
Lately I have noticed a number of users are forgetting that they
have uncommitted changes in their working directory when they switch
to another branch. This causes the user to accidentally carry those
changes into the new branch, which is usually not where they wanted
to commit them. A correlation does appear to exist between the user
being interrupted in the middle of their task and the branch switch,
indicating they simply got distracted and forgot what was going on.
Git shouldn't cause the user to make mistakes when it can help to
prevent them. So now users may set checkout.requireCleanDirectory
to true in their config file to have git-checkout verify the working
directory is clean before switching branches.
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
Documentation/config.txt | 8 ++++++++
git-checkout.sh | 10 ++++++++++
t/t3200-branch.sh | 11 +++++++++++
3 files changed, 29 insertions(+), 0 deletions(-)
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 9d754c8..f10e8ac 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -136,6 +136,14 @@ checkout.requireSourceBranch::
be the source version if only one argument is supplied.
Default is false, to stay compatible with prior behavior.
+checkout.requireCleanDirectory::
+ If true tells git-checkout to verify there are no uncommitted
+ changes still in the index or working directory before
+ switching branches. If uncommitted changes exist the -m
+ flag can be used to skip the check if the user really wanted
+ to carry those onto the new branch. Default is false,
+ to stay compatible with prior behavior.
+
pager.color::
A boolean to enable/disable colored output when the pager is in
use (default is true).
diff --git a/git-checkout.sh b/git-checkout.sh
index 5f9fb6e..c04b8c1 100755
--- a/git-checkout.sh
+++ b/git-checkout.sh
@@ -171,6 +171,16 @@ then
git-read-tree --reset -u $new
else
git-update-index --refresh >/dev/null
+ if [ -n "$old" ] &&
+ [ -z "$merge" ] &&
+ [ Xtrue = "X`git-repo-config --bool checkout.requireCleanDirectory`" ]
+ then
+ if [ `git-diff-index --cached $old | wc -l` -gt 0 ] ||
+ [ `git-diff-files | wc -l` -gt 0 ]
+ then
+ die "Working directory has uncommitted changes; commit, reset or use -m"
+ fi
+ fi
merge_error=$(git-read-tree -m -u $old $new 2>&1) || (
case "$merge" in
'')
diff --git a/t/t3200-branch.sh b/t/t3200-branch.sh
index 7e0c48b..9429827 100755
--- a/t/t3200-branch.sh
+++ b/t/t3200-branch.sh
@@ -84,4 +84,15 @@ test_expect_success \
'git-repo-config checkout.requireSourceBranch false
git-checkout -b N'
+test_expect_failure \
+ 'git checkout -b O works only if tree is clean' \
+ 'git-repo-config checkout.requireCleanDirectory true
+ echo atest >atest
+ git add atest
+ git-checkout -b O'
+
+test_expect_success \
+ 'git checkout -m -b O works' \
+ 'git-checkout -m -b O'
+
test_done
--
next parent reply other threads:[~2006-12-07 10:02 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <6ed9774cb95e873e76a4ac406dd740caf954bd3b.1165485618.git.spearce@spearce.org>
2006-12-07 10:02 ` Shawn O. Pearce [this message]
2006-12-07 19:38 ` [PATCH 2/2] Optionally check for uncommitted changes before switching branches Junio C Hamano
2006-12-07 19:43 ` Shawn Pearce
2006-12-07 23:01 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20061207100224.GB12966@spearce.org \
--to=spearce@spearce.org \
--cc=git@vger.kernel.org \
--cc=junkio@cox.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.