All of lore.kernel.org
 help / color / mirror / Atom feed
From: Clemens Buchacher <drizzd@aon.at>
To: Junio C Hamano <gitster@pobox.com>
Cc: Joshua Jensen <jjensen@workspacewhiz.com>,
	"git@vger.kernel.org" <git@vger.kernel.org>
Subject: [PATCH] optionally disable overwriting of ignored files
Date: Thu, 19 Aug 2010 01:39:00 +0200	[thread overview]
Message-ID: <20100818233900.GA27531@localhost> (raw)
In-Reply-To: <7viq39avay.fsf@alter.siamese.dyndns.org>

[-- Attachment #1: Type: text/plain, Size: 6594 bytes --]

By default, checkout and fast-forward merge will overwrite ignored
files. Make this behavior configurable.

If overwriting ignored files is disabled, it can still be enabled
on the command line by passing -i to merge or checkout.

Signed-off-by: Clemens Buchacher <drizzd@aon.at>
---

Hi,

On Tue, Aug 17, 2010 at 12:33:25PM -0700, Junio C Hamano wrote:
>
> Ancient git didn't honor gitignore and considered no files trashable,
> which caused a lot of trouble to users.  It may be illuminating to check
> discussions in the list archive during the period the following commits
> were made.  f8a9d42 (read-tree: further loosen "working file will be lost"
> check., 2006-12-04), ed93b44 (merge: loosen overcautious "working file
> will be lost" check., 2006-10-08), c819353 (Fix switching to a branch with
> D/F when current branch has file D., 2007-03-15).

I am not convinced this is something that most users want.

The fact that adding a file to .gitignore also marks it as
trashable to git is quite surprising to me. This is something that
the gitignore manpage should warn about loudly. Instead, I think
this behavior is completely undocumented.

As far as I can tell from the code, only fast-forward merge and
checkout overwrite ignored files by default. A regular merge will
complain about untracked files that would be overwritten (ignored
or not). I am quite familiar with that behavior and I think it's
useful to be reminded of those untracked files rather than having
them overwritten. I thought that by extension, other git commands
would behave in the same way.

Here is a patch to optionally disable overwriting of ignored files.
But I think we should even disable it by default. 

Clemens

 Documentation/config.txt |    6 ++++++
 builtin/checkout.c       |    7 +++++++
 builtin/merge.c          |    9 +++++++++
 cache.h                  |    1 +
 config.c                 |    3 +++
 environment.c            |    1 +
 6 files changed, 27 insertions(+), 0 deletions(-)

diff --git a/Documentation/config.txt b/Documentation/config.txt
index f81fb91..eb9bb43 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -450,6 +450,12 @@ core.excludesfile::
 	to the value of `$HOME` and "{tilde}user/" to the specified user's
 	home directory.  See linkgit:gitignore[5].
 
+core.overwriteignored::
+	Untracked files can get in the way of merge or checkout. If
+	overwriteignored is enabled, such files will be overwritten
+	to let fast-forward merges and checkouts succeed. Enabled
+	by default.
+
 core.editor::
 	Commands such as `commit` and `tag` that lets you edit
 	messages by launching an editor uses the value of this
diff --git a/builtin/checkout.c b/builtin/checkout.c
index 5affb6f..121a6a3 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -389,6 +389,11 @@ static int merge_working_tree(struct checkout_opts *opts,
 		topts.gently = opts->merge && old->commit;
 		topts.verbose_update = !opts->quiet;
 		topts.fn = twoway_merge;
+		if (overwrite_ignored) {
+			topts.dir = xcalloc(1, sizeof(*topts.dir));
+			topts.dir->flags |= DIR_SHOW_IGNORED;
+			topts.dir->exclude_per_dir = ".gitignore";
+		}
 		tree = parse_tree_indirect(old->commit ?
 					   old->commit->object.sha1 :
 					   (unsigned char *)EMPTY_TREE_SHA1_BIN);
@@ -664,6 +669,8 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
 		OPT_SET_INT('3', "theirs", &opts.writeout_stage, "stage",
 			    3),
 		OPT_BOOLEAN('f', "force", &opts.force, "force"),
+		OPT_BOOLEAN('i', "overwrite-ignored", &overwrite_ignored,
+		  "allow explicitly ignored files to be overwritten"),
 		OPT_BOOLEAN('m', "merge", &opts.merge, "merge"),
 		OPT_STRING(0, "conflict", &conflict_style, "style",
 			   "conflict style (merge or diff3)"),
diff --git a/builtin/merge.c b/builtin/merge.c
index 4d31e09..47b12ba 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -185,6 +185,8 @@ static struct option builtin_merge_options[] = {
 		"allow fast-forward (default)"),
 	OPT_BOOLEAN(0, "ff-only", &fast_forward_only,
 		"abort if fast-forward is not possible"),
+	OPT_BOOLEAN('i', "overwrite-ignored", &overwrite_ignored,
+	  "allow explicitly ignored files to be overwritten"),
 	OPT_RERERE_AUTOUPDATE(&allow_rerere_auto),
 	OPT_CALLBACK('s', "strategy", &use_strategies, "strategy",
 		"merge strategy to use", option_parse_strategy),
@@ -682,6 +684,7 @@ int checkout_fast_forward(const unsigned char *head, const unsigned char *remote
 	struct unpack_trees_options opts;
 	struct tree_desc t[MAX_UNPACK_TREES];
 	int i, fd, nr_trees = 0;
+	struct dir_struct dir;
 	struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));
 
 	refresh_cache(REFRESH_QUIET);
@@ -691,6 +694,12 @@ int checkout_fast_forward(const unsigned char *head, const unsigned char *remote
 	memset(&trees, 0, sizeof(trees));
 	memset(&opts, 0, sizeof(opts));
 	memset(&t, 0, sizeof(t));
+	memset(&dir, 0, sizeof(dir));
+	if (overwrite_ignored) {
+		dir.flags |= DIR_SHOW_IGNORED;
+		dir.exclude_per_dir = ".gitignore";
+		opts.dir = &dir;
+	}
 
 	opts.head_idx = 1;
 	opts.src_index = &the_index;
diff --git a/cache.h b/cache.h
index c9fa3df..dd1b8f7 100644
--- a/cache.h
+++ b/cache.h
@@ -548,6 +548,7 @@ extern size_t packed_git_window_size;
 extern size_t packed_git_limit;
 extern size_t delta_base_cache_limit;
 extern int read_replace_refs;
+extern int overwrite_ignored;
 extern int fsync_object_files;
 extern int core_preload_index;
 extern int core_apply_sparse_checkout;
diff --git a/config.c b/config.c
index cdcf583..bd7956e 100644
--- a/config.c
+++ b/config.c
@@ -563,6 +563,9 @@ static int git_default_core_config(const char *var, const char *value)
 	if (!strcmp(var, "core.excludesfile"))
 		return git_config_pathname(&excludes_file, var, value);
 
+	if (!strcmp(var, "core.overwriteignored"))
+		overwrite_ignored = git_config_bool(var, value);
+
 	if (!strcmp(var, "core.whitespace")) {
 		if (!value)
 			return config_error_nonbool(var);
diff --git a/environment.c b/environment.c
index 83d38d3..1b92f60 100644
--- a/environment.c
+++ b/environment.c
@@ -30,6 +30,7 @@ const char *apply_default_ignorewhitespace;
 int zlib_compression_level = Z_BEST_SPEED;
 int core_compression_level;
 int core_compression_seen;
+int overwrite_ignored = 1;
 int fsync_object_files;
 size_t packed_git_window_size = DEFAULT_PACKED_GIT_WINDOW_SIZE;
 size_t packed_git_limit = DEFAULT_PACKED_GIT_LIMIT;
-- 
1.7.2.1.1.g202c


[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 490 bytes --]

  reply	other threads:[~2010-08-18 23:39 UTC|newest]

Thread overview: 86+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-15 13:01 Ignored files being silently overwritten when switching branches Per Lundberg
2018-10-16  6:40 ` Jeff King
2018-10-16  9:10   ` Ævar Arnfjörð Bjarmason
2010-08-17  5:21     ` git merge, .gitignore, and silently overwriting untracked files Joshua Jensen
2010-08-17 19:33       ` Junio C Hamano
2010-08-18 23:39         ` Clemens Buchacher [this message]
2010-08-19 10:41           ` [PATCH] optionally disable overwriting of ignored files Jakub Narebski
2010-08-20 18:48             ` Clemens Buchacher
2010-08-20 19:01               ` Joshua Jensen
2010-08-20 20:35           ` Junio C Hamano
2010-08-21  8:05             ` Clemens Buchacher
2010-08-22  7:25               ` Junio C Hamano
2010-08-22  8:20                 ` Clemens Buchacher
2010-10-09 22:39               ` Kevin Ballard
2010-08-21 13:23             ` Clemens Buchacher
2010-10-09 13:52             ` [PATCH 0/5] do not overwrite untracked files in leading path Clemens Buchacher
2010-10-09 13:52             ` [PATCH 1/5] t7607: use test_commit and test_must_fail Clemens Buchacher
2010-10-10  6:35               ` Jonathan Nieder
2010-10-10  8:35                 ` [PATCH 1/5 v2] t7607: use test-lib functions and check MERGE_HEAD Clemens Buchacher
2010-10-13 21:33                   ` Junio C Hamano
2010-10-13 21:59                   ` Junio C Hamano
2010-10-09 13:52             ` [PATCH 2/5] t7607: add leading-path tests Clemens Buchacher
2010-10-09 19:14               ` Johannes Sixt
2010-10-10  8:38                 ` [PATCH 2/5 v2] " Clemens Buchacher
2010-10-09 13:52             ` [PATCH 3/5] add function check_ok_to_remove() Clemens Buchacher
2010-10-13 21:43               ` Junio C Hamano
2010-10-09 13:52             ` [PATCH 4/5] lstat_cache: optionally return match_len Clemens Buchacher
2010-10-09 13:53             ` [PATCH 5/5] do not overwrite files in leading path Clemens Buchacher
2010-10-13 21:57               ` Junio C Hamano
2010-10-13 22:34                 ` Clemens Buchacher
2010-10-15  6:48                   ` Clemens Buchacher
2010-10-15 18:47                     ` Junio C Hamano
2010-08-20 20:46           ` [PATCH] optionally disable overwriting of ignored files Junio C Hamano
2010-08-21  6:48             ` [PATCH v2] " Clemens Buchacher
2010-08-23  8:33           ` [PATCH] " Matthieu Moy
2010-08-31 18:44             ` Heiko Voigt
2010-08-23  9:37           ` Matthieu Moy
2010-08-23 13:56             ` Holger Hellmuth
2010-08-23 15:11               ` Clemens Buchacher
2010-08-23 15:57                 ` Junio C Hamano
2010-08-24  7:28                   ` Clemens Buchacher
2010-08-24 16:19                     ` Junio C Hamano
2018-11-06 12:41       ` Checkout deleted semi-untracked file Steffen Jost
2018-11-06 15:12         ` Ævar Arnfjörð Bjarmason
2018-11-11  9:52           ` [RFC PATCH] Introduce "precious" file concept Nguyễn Thái Ngọc Duy
2018-11-11 12:15             ` Bert Wesarg
2018-11-11 12:33             ` Ævar Arnfjörð Bjarmason
2018-11-11 13:06               ` Ævar Arnfjörð Bjarmason
2018-11-12 16:14                 ` Duy Nguyen
2018-11-11 15:41               ` Duy Nguyen
2018-11-11 16:55                 ` Ævar Arnfjörð Bjarmason
2018-11-12  7:35                 ` Per Lundberg
2018-11-12  9:08                   ` Matthieu Moy
2018-11-12  9:49                     ` Ævar Arnfjörð Bjarmason
2018-11-12 10:26                       ` Junio C Hamano
2018-11-12 12:45                         ` Ævar Arnfjörð Bjarmason
2018-11-12 13:02                           ` Junio C Hamano
2018-11-12 16:07                     ` Duy Nguyen
2018-11-12 23:22               ` brian m. carlson
2018-11-26  9:30                 ` Per Lundberg
2018-11-26 10:28                   ` Ævar Arnfjörð Bjarmason
2018-11-26 12:49                   ` Junio C Hamano
2018-11-27 15:08                     ` Ævar Arnfjörð Bjarmason
2018-11-28  3:58                       ` Junio C Hamano
2018-11-28 21:54                         ` Ævar Arnfjörð Bjarmason
2018-11-29  5:04                           ` Junio C Hamano
2018-12-01  6:21                           ` Duy Nguyen
2018-11-26 15:26                   ` Duy Nguyen
2018-11-26 15:34                     ` Ævar Arnfjörð Bjarmason
2018-11-26 15:40                       ` Duy Nguyen
2018-11-26 15:47                         ` Ævar Arnfjörð Bjarmason
2018-11-26 15:55                           ` Duy Nguyen
2018-11-27  9:43                             ` Per Lundberg
2018-11-27 12:55                               ` Jacob Keller
2018-11-27 14:50                                 ` Per Lundberg
2018-11-28  1:21                                   ` brian m. carlson
2018-11-28  6:54                                     ` Per Lundberg
2018-11-27 15:19                                 ` Duy Nguyen
2018-12-06 18:39                                 ` Duy Nguyen
2018-11-26 16:02                 ` Eckhard Maaß
2018-11-11 12:59             ` Junio C Hamano
2018-11-26 19:38             ` [PATCH v2 0/2] Precios files round two Nguyễn Thái Ngọc Duy
2018-11-26 19:38               ` [PATCH v2 1/2] Introduce "precious" file concept Nguyễn Thái Ngọc Duy
2018-11-26 19:38               ` [PATCH v2 2/2] unpack-trees: support core.allIgnoredFilesArePreciousWhenMerging Nguyễn Thái Ngọc Duy
2018-10-16 15:05     ` Ignored files being silently overwritten when switching branches Duy Nguyen
2018-10-18  1:55       ` 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=20100818233900.GA27531@localhost \
    --to=drizzd@aon.at \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=jjensen@workspacewhiz.com \
    /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.