git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] Add test that checkout does not overwrite entries in .git/info/exclude

From
Johannes Sixt <j.sixt@viscovery.net>
Date
Nov 21, 2011, 07:23 UTC
Message-ID
<4EC9FC81.3080306@viscovery.net>
In-Reply-To
<7vzkfqgn91.fsf@alter.siamese.dyndns.org>
From: Johannes Sixt <j6t@kdbg.org>

It is an unintended accident that entries matched by .git/info/exclude are considered precious, but entries matched by .gitignore are not. That is, 'git checkout' will overwrite untracked files matched by .gitignore, but refuses to overwrite files matched by .git/info/exclude.

It is a lucky accident: it allows the distinction between "untracked but precious" and "untracked and garbage". And it is a doubly lucky accident: .gitignore entries are meant for files like build products, which usually affect all consumers of a repository, whereas .git/info/exclude is intended for personal files, which frequently are precious (think of a TODO file).

Add a test that codifies the accident as wanted behavior.
Signed-off-by: Johannes Sixt <j6t@kdbg.org>
---
Am 11/21/2011 4:36, schrieb Junio C Hamano:
> As far as I am aware, info/exclude should work exactly the same as having
> a .gitignore file at the root level of the working tree. Can you show a
> minimum reproduction recipe in a form of a patch to our test scripts in t/
> hierarchy?

Here you are. As you can see from my commit message, IMO, this is a very useful accident. Therefore, there is no 'test_expect_failure' in the test script :-)

-- Hannes
 t/t2023-checkout-ignored.sh |   51 +++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 51 insertions(+), 0 deletions(-)
 create mode 100755 t/t2023-checkout-ignored.sh
diff --git a/t/t2023-checkout-ignored.sh b/t/t2023-checkout-ignored.sh
new file mode 100755
index 0000000..03a5a56
--- /dev/null
+++ b/t/t2023-checkout-ignored.sh
@@ -0,0 +1,51 @@
+#!/bin/sh
+
+test_description='checkout overwrites or preserves ignored files
+
+`git checkout` makes a distinction between files mentioned in
+.gitignore and .git/info/exclude in that untracked files matched
+by the latter are considered precious and are not overwritten.
+'
+
+. ./test-lib.sh
+
+test_expect_success setup '
+
+	echo excluded > excluded &&
+	echo ignored > ignored &&
+	git add . &&
+	test_commit initial &&
+	git checkout -b side &&
+	git rm excluded &&
+	git mv ignored .gitignore &&
+	test_commit side &&
+	echo excluded >> .git/info/exclude
+'
+
+test_expect_success 'files are ignored' '
+
+	echo keep > excluded &&
+	echo overwrite > ignored &&
+	list=$(git ls-files --others --exclude-standard) &&
+	test -z "$list"
+'
+
+test_expect_success 'entries in .git/info/exclude are precious' '
+
+	test_must_fail git checkout master 2>errors &&
+	test_i18ngrep "would be overwritten" errors &&
+	grep "	excluded" errors &&
+	! grep "	ignored" errors &&
+	grep keep excluded &&
+	grep overwrite ignored
+'
+
+test_expect_success 'entries in .gitignore are not precious' '
+
+	rm -f excluded &&
+	git checkout master &&
+	grep excluded excluded &&
+	grep ignored ignored
+'
+
+test_done
-- 
1.7.8.rc0.126.gd15506
Previous: Junio C HamanoNext: Philip Oakley
Message 5 of 23 in “Bug report - local (and git ignored) file silently removed after checkout”
  1. Bertrand BENOITNov 20, 2011
  2. Junio C HamanoNov 20, 2011
  3. Taylor HedbergNov 20, 2011
  4. Junio C HamanoNov 21, 2011
  5. Add test that checkout does not overwrite entries in .git/info/excludeJohannes Sixt, Nov 21, 2011
  6. Philip OakleyNov 21, 2011
  7. Junio C HamanoNov 21, 2011
  8. Junio C HamanoNov 21, 2011
  9. Nguyen Thai Ngoc DuyNov 21, 2011
  10. Junio C HamanoNov 21, 2011
  11. Nguyen Thai Ngoc DuyNov 23, 2011
  12. Nguyen Thai Ngoc DuyNov 21, 2011
  13. Junio C HamanoNov 21, 2011
  14. Bertrand BENOITNov 21, 2011
  15. Nguyen Thai Ngoc DuyNov 23, 2011
  16. Junio C HamanoNov 23, 2011
  17. Nguyen Thai Ngoc DuyNov 24, 2011
  18. Junio C HamanoNov 24, 2011
  19. Nguyen Thai Ngoc DuyNov 24, 2011
  20. Nguyen Thai Ngoc DuyNov 27, 2011
  21. 1/2 checkout,merge: loosen overwriting untracked file check based on info/excludeNguyễn Thái Ngọc Duy, Nov 27, 2011
  22. 2/2 checkout,merge: disallow overwriting ignored files with --no-overwrite-ignoreNguyễn Thái Ngọc Duy, Nov 27, 2011
  23. Junio C HamanoNov 29, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.