{"thread":{"id":"62140","subject":"[PATCH 0/4] deprecating core.preferSymlinkRefs","startedAt":"2024-09-18T23:28:28Z","lastAt":"2024-09-30T20:13:24Z","messageCount":12,"participants":["Junio C Hamano","Derrick Stolee","Patrick Steinhardt","Jeff King"],"isPatch":true,"patchVersion":1,"patchTotal":4},"messages":[{"id":"503036","messageId":"20240918232825.2627999-1-gitster@pobox.com","threadId":"62140","inReplyTo":null,"subject":"[PATCH 0/4] deprecating core.preferSymlinkRefs","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2024-09-18T23:28:21Z","receivedAt":"2024-09-18T23:28:28Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Removal of support for core.preferSymlinkRefs at Git 3.0 boundary,\nso that we only write textual symrefs for things like HEAD and\nrefs/remotes/origin/HEAD, and still understand symbolic links used\nas symrefs in existing repositories, is a serious proposal this\npatch series makes.\n\nBut at the same time, this is an RFC.  I wrote it to serve as a\ncandidate for BCP, a guide to those who want to add an entry to the\nbreaking changes document.  I think anything that is described in\nthe breaking changes document has to become a patch series that\nspans multi-year effort, and that must be done with care.\n\n - The proposal phase.  A breaking change is outlined, transition\n   plan is given, and the first step of the transition (often,\n   starting to give a warning and offering an alternative to the\n   feature planned to be removed are involved) is presented.  The\n   aim is that after N years, the user base will be aware of the\n   upcoming removal and would already be prepared to be able to work\n   with Git 3.0 that lacks the removed feature.\n\n   In this series, [Patch 1/4] does this.\n\n - The Git 3.0 phase.  A breaking change is actually implemented.\n   It optionally can offer help to those who procrastinated until\n   the last-minute to break them, but the feature itself is gone.\n\n   In this series, [PATCH 2/4] and [Patch 3/4] do this.\n\n - Clean-up phase.  If the previous phase added an additional\n   transition help, after M years, such a help meant for transition\n   would be removed.\n\n   In this series, [PATCH 4/4] does this.\n\nWhat I want people to think about is how to ensure quality of the\nGit 3.0 phase.  We can iterate and polish the proposal phase with as\nmuch time as we want to spend, just like any new feature.  But Git\n3.0 phase is with a solid deadline, and before that time, we cannot\nremove the feature for real.  Would we cook such steps in 'next'\nforever until the actual Git 3.0?  To those users who are running\n'next' based Git, it would mean that some of the changes the\nbreaking changes document listed would come a lot earlier to them.\nOn the other hand, unless we somehow have a way to expose willing\nvolunteers an early access to these \"big changes\", there is no way\nfor them to be as stable and tested.  We should not plan to scramble\nand be able to perfect these changes between Git v3.0-rc0 and Git\nv3.0 final.\n\nOr perhaps use the \"experimental.*\" configuration stored in the\nuser's ~/.gitconfig to let users opt into Git 3.0 features (one of\nwhich may be that textual symrefs are always used regardless of the\ncore.preferSymlinkRefs setting)?  That way, we can merge these big\nchanges early without worrying about accidentally affecting the\nend-user population.\n\nJunio C Hamano (4):\n  refs: deprecate core.preferSymlinkRefs\n  refs: mostly remove core.preferSymlinkRefs\n  refs: remove NO_SYMLINK_HEAD\n  refs: remove the last remnants of core.preferSymlinkRefs\n\n Documentation/BreakingChanges.txt   | 11 ++++++++\n Documentation/config/core.txt       |  6 -----\n Makefile                            |  6 -----\n config.c                            |  5 ----\n config.mak.uname                    |  3 ---\n configure.ac                        |  3 ---\n contrib/buildsystems/CMakeLists.txt |  2 +-\n environment.c                       |  1 -\n environment.h                       |  1 -\n refs/files-backend.c                | 26 -------------------\n t/t0600-reffiles-backend.sh         | 39 ++++++++++++++++-------------\n 11 files changed, 34 insertions(+), 69 deletions(-)\n\n-- \n2.46.1-742-g4240f61078\n\n"},{"id":"503037","messageId":"20240918232825.2627999-2-gitster@pobox.com","threadId":"62140","inReplyTo":"20240918232825.2627999-1-gitster@pobox.com","subject":"[PATCH 1/4] refs: deprecate core.preferSymlinkRefs","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2024-09-18T23:28:22Z","receivedAt":"2024-09-18T23:28:30Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"This step is for immediate consumption.\n\nSymbolic links, e.g. .git/HEAD or .git/refs/remotes/origin/HEAD,\nhave been used to represent a symref since very early versions of\nGit, and they can still be created if the core.preferSymlinkRefs\nconfiguration variable tells us to.\n\nThey however have two downsides:\n\n - Obviously, a filesystem that does not support a symbolic link\n   cannot use the feature.  For this reason alone, we have long\n   flipped the default to use textual symref, i.e., a regular file\n   with a format that Git recognises.\n\n - Except for HEAD and anything at the root level of the refname\n   hierarchy, following a symbolic link that represents the symref\n   would not lead to the referent ref.  For example, in order to\n   express that we consider 'main' branch to be the primary among\n   our tracking branches for the 'origin' remote, we would have a\n   symbolic ref .git/refs/remotes/origin/HEAD but the result of\n   calling readlink(2) on the symbolic link is not 'main', nor\n   \"$(pwd)/.git/refs/remotes/origin/main\".  It is relative to the\n   $GIT_DIR, i.e., \"refs/remotes/origin/master\".  This is highly\n   counter-intuitive.\n\nLet's decide and declare to remove the support to create such\nsymbolic links at the Git 3.0 version boundary, and in preparation\nfor the move, start warning when somebody _creates_ a symbolic link\nto represent a new symref.\n\nIf a third-party tool still expects that HEAD is nothing but a\nsymbolic link, either its authors have got end-user complaints since\nwe made the textual symrefs the default in mid 2006, or nobody is\nusing such a tool so breaking them does not matter.  It would not be\na problem in practice if Git would never create a symbolic link to\nrepresent a symbolic ref.\n\nWe do not plan to deprecate (or remove) the support to use existing\nsymbolic links at this point, though.\n\nAs to the implementation:\n\n - We give a warning only where the configuration set to true is\n   actually affecting the behaviour of Git, since the behaviour the\n   user is getting today will change with the planned removal.  A\n   configuration set to true will not cause a warning, unless you\n   create a symref (e.g., by switching a branch).\n\n - The clean-up procedure of the existing tests did not account for\n   the fact that \"git symbolic -d REF\" on an non-existing REF to\n   fail, which was corrected, together with use of @ where HEAD is\n   more descriptive and perfectly understandable.\n\nSigned-off-by: Junio C Hamano <gitster@pobox.com>\n---\n Documentation/BreakingChanges.txt | 11 +++++++++++\n Documentation/config/core.txt     |  9 ++++-----\n refs/files-backend.c              |  2 ++\n t/t0600-reffiles-backend.sh       | 18 ++++++++++--------\n 4 files changed, 27 insertions(+), 13 deletions(-)\n\ndiff --git a/Documentation/BreakingChanges.txt b/Documentation/BreakingChanges.txt\nindex 2b64665694..57c002dd0d 100644\n--- a/Documentation/BreakingChanges.txt\n+++ b/Documentation/BreakingChanges.txt\n@@ -135,6 +135,17 @@ Cf. <xmqq1rjuz6n3.fsf_-_@gitster.c.googlers.com>,\n     <CAKvOHKAFXQwt4D8yUCCkf_TQL79mYaJ=KAKhtpDNTvHJFuX1NA@mail.gmail.com>,\n     <20230323204047.GA9290@coredump.intra.peff.net>,\n \n+* Support for the `core.preferSymlinkRefs` configuration variable\n+  will be removed.\n++\n+  ** The configuration would obviously not work on a filesystem\n+     where symbolic links are not supported.\n+  ** The contents of such a symbolic link used as a symref does\n+     not match end-user intuition unless it is `HEAD`.\n++\n+The support to treat existing symbolic links under the\n+`$GIT_DIR/refs/` directory as symrefs is not going away.\n+\n == Superseded features that will not be deprecated\n \n Some features have gained newer replacements that aim to improve the design in\ndiff --git a/Documentation/config/core.txt b/Documentation/config/core.txt\nindex 60ca9f2b68..f0245f5050 100644\n--- a/Documentation/config/core.txt\n+++ b/Documentation/config/core.txt\n@@ -285,11 +285,10 @@ CIFS/Microsoft Windows.\n +\n False by default.\n \n-core.preferSymlinkRefs::\n-\tInstead of the default \"symref\" format for HEAD\n-\tand other symbolic reference files, use symbolic links.\n-\tThis is sometimes needed to work with old scripts that\n-\texpect HEAD to be a symbolic link.\n+core.preferSymlinkRefs (deprecated)::\n+\tInstead of the default \"symref\" format for HEAD and other\n+\tsymbolic reference files, use symbolic links.  The support\n+\tfor this variable will be dropped in Git 3.0.\n \n core.alternateRefsCommand::\n \tWhen advertising tips of available history from an alternate, use the shell to\ndiff --git a/refs/files-backend.c b/refs/files-backend.c\nindex c7f3f4e591..c40a248b9f 100644\n--- a/refs/files-backend.c\n+++ b/refs/files-backend.c\n@@ -2025,6 +2025,8 @@ static int create_ref_symlink(struct ref_lock *lock, const char *target)\n \n \tif (ret)\n \t\tfprintf(stderr, \"no symlink - falling back to symbolic ref\\n\");\n+\telse\n+\t\twarning(\"core.preferSymlinkRefs will be removed in Git 3.0\");\n \treturn ret;\n }\n #endif\ndiff --git a/t/t0600-reffiles-backend.sh b/t/t0600-reffiles-backend.sh\nindex 20df336cc3..d369330562 100755\n--- a/t/t0600-reffiles-backend.sh\n+++ b/t/t0600-reffiles-backend.sh\n@@ -469,8 +469,8 @@ test_expect_success POSIXPERM 'git reflog expire honors core.sharedRepository' '\n '\n \n test_expect_success SYMLINKS 'symref transaction supports symlinks' '\n-\ttest_when_finished \"git symbolic-ref -d TEST_SYMREF_HEAD\" &&\n-\tgit update-ref refs/heads/new @ &&\n+\ttest_when_finished \"git symbolic-ref -d TEST_SYMREF_HEAD || :\" &&\n+\tgit update-ref refs/heads/new HEAD &&\n \ttest_config core.prefersymlinkrefs true &&\n \tcat >stdin <<-EOF &&\n \tstart\n@@ -478,14 +478,15 @@ test_expect_success SYMLINKS 'symref transaction supports symlinks' '\n \tprepare\n \tcommit\n \tEOF\n-\tgit update-ref --no-deref --stdin <stdin &&\n+\tgit update-ref --no-deref --stdin <stdin 2>stderr &&\n \ttest_path_is_symlink .git/TEST_SYMREF_HEAD &&\n-\ttest \"$(test_readlink .git/TEST_SYMREF_HEAD)\" = refs/heads/new\n+\ttest \"$(test_readlink .git/TEST_SYMREF_HEAD)\" = refs/heads/new &&\n+\ttest_grep \"core\\.preferSymlinkRefs will be removed\" stderr\n '\n \n test_expect_success 'symref transaction supports false symlink config' '\n-\ttest_when_finished \"git symbolic-ref -d TEST_SYMREF_HEAD\" &&\n-\tgit update-ref refs/heads/new @ &&\n+\ttest_when_finished \"git symbolic-ref -d TEST_SYMREF_HEAD || :\" &&\n+\tgit update-ref refs/heads/new HEAD &&\n \ttest_config core.prefersymlinkrefs false &&\n \tcat >stdin <<-EOF &&\n \tstart\n@@ -493,11 +494,12 @@ test_expect_success 'symref transaction supports false symlink config' '\n \tprepare\n \tcommit\n \tEOF\n-\tgit update-ref --no-deref --stdin <stdin &&\n+\tgit update-ref --no-deref --stdin <stdin 2>stderr &&\n \ttest_path_is_file .git/TEST_SYMREF_HEAD &&\n \tgit symbolic-ref TEST_SYMREF_HEAD >actual &&\n \techo refs/heads/new >expect &&\n-\ttest_cmp expect actual\n+\ttest_cmp expect actual &&\n+\ttest_grep ! \"core\\.preferSymlinkRefs will be removed\" stderr\n '\n \n test_done\n-- \n2.46.1-742-g4240f61078\n\n"},{"id":"503038","messageId":"20240918232825.2627999-3-gitster@pobox.com","threadId":"62140","inReplyTo":"20240918232825.2627999-1-gitster@pobox.com","subject":"[PATCH 2/4] refs: mostly remove core.preferSymlinkRefs","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2024-09-18T23:28:23Z","receivedAt":"2024-09-18T23:28:32Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"This step and the next step are for Git 3.0.\n\nNow we are preparing for a big Git 3.0 transition after warning\nagainst use of this configuration variable to create a new symlink\nthat represents a symbolic ref for N months, it is time to actually\nremove the support of the configuration variable.\n\nIn this patch, we mostly ignore core.preferSymlinkRefs and always\ncreate a textual symref when we are asked to create a symref, but\nwhen core.preferSymlinkRefs would have caused us to use a symbolic\nlink in an older version of Git, we will issue a warning.  We also\nhave in our build infrastructure to selectively set the CPP macro\nNO_SYMLINK_HEAD, but an accompanying patch will remove them.\n\nThe final warning is meant to help users who set the configuration\nvariable and expected it to create a symlink, but instead got a\ntextual symref.  They may not even recognise the configuration after\nthey set it long time ago and forgot about it by now, so we keep the\n\"git config --help\" entry for the variable to help them recall what\nit was about.\n\nAfter a few releases, we will get rid of this warning and the\ncodebase will look as if such a configuration variable never\nexisted, but we are not quite there yet.\n\nSigned-off-by: Junio C Hamano <gitster@pobox.com>\n---\n Documentation/config/core.txt |  4 ++--\n refs/files-backend.c          | 29 +++---------------------\n t/t0600-reffiles-backend.sh   | 42 +++++++++++++++++++++++------------\n 3 files changed, 33 insertions(+), 42 deletions(-)\n\ndiff --git a/Documentation/config/core.txt b/Documentation/config/core.txt\nindex f0245f5050..a6f67cab27 100644\n--- a/Documentation/config/core.txt\n+++ b/Documentation/config/core.txt\n@@ -285,10 +285,10 @@ CIFS/Microsoft Windows.\n +\n False by default.\n \n-core.preferSymlinkRefs (deprecated)::\n+core.preferSymlinkRefs (removed)::\n \tInstead of the default \"symref\" format for HEAD and other\n \tsymbolic reference files, use symbolic links.  The support\n-\tfor this variable will be dropped in Git 3.0.\n+\tfor this variable was dropped in Git 3.0.\n \n core.alternateRefsCommand::\n \tWhen advertising tips of available history from an alternate, use the shell to\ndiff --git a/refs/files-backend.c b/refs/files-backend.c\nindex c40a248b9f..1296272252 100644\n--- a/refs/files-backend.c\n+++ b/refs/files-backend.c\n@@ -2011,26 +2011,6 @@ static int commit_ref_update(struct files_ref_store *refs,\n \treturn 0;\n }\n \n-#ifdef NO_SYMLINK_HEAD\n-#define create_ref_symlink(a, b) (-1)\n-#else\n-static int create_ref_symlink(struct ref_lock *lock, const char *target)\n-{\n-\tint ret = -1;\n-\n-\tchar *ref_path = get_locked_file_path(&lock->lk);\n-\tunlink(ref_path);\n-\tret = symlink(target, ref_path);\n-\tfree(ref_path);\n-\n-\tif (ret)\n-\t\tfprintf(stderr, \"no symlink - falling back to symbolic ref\\n\");\n-\telse\n-\t\twarning(\"core.preferSymlinkRefs will be removed in Git 3.0\");\n-\treturn ret;\n-}\n-#endif\n-\n static int create_symref_lock(struct ref_lock *lock, const char *target,\n \t\t\t      struct strbuf *err)\n {\n@@ -3003,13 +2983,10 @@ static int files_transaction_finish(struct ref_store *ref_store,\n \t\t\t}\n \t\t}\n \n-\t\t/*\n-\t\t * We try creating a symlink, if that succeeds we continue to the\n-\t\t * next update. If not, we try and create a regular symref.\n-\t\t */\n+\t\t/* Warn against core.preferSymlinkRefs set to true */\n \t\tif (update->new_target && prefer_symlink_refs)\n-\t\t\tif (!create_ref_symlink(lock, update->new_target))\n-\t\t\t\tcontinue;\n+\t\t\t/* we used to, but no longer, create a symlink here */\n+\t\t\twarning(\"core.preferSymlinkRefs was removed in Git 3.0\");\n \n \t\tif (update->flags & REF_NEEDS_COMMIT) {\n \t\t\tclear_loose_ref_cache(refs);\ndiff --git a/t/t0600-reffiles-backend.sh b/t/t0600-reffiles-backend.sh\nindex d369330562..4e517cdc13 100755\n--- a/t/t0600-reffiles-backend.sh\n+++ b/t/t0600-reffiles-backend.sh\n@@ -468,26 +468,40 @@ test_expect_success POSIXPERM 'git reflog expire honors core.sharedRepository' '\n \tesac\n '\n \n-test_expect_success SYMLINKS 'symref transaction supports symlinks' '\n+test_expect_success SYMLINKS 'symlinks used as symrefs are still supported' '\n \ttest_when_finished \"git symbolic-ref -d TEST_SYMREF_HEAD || :\" &&\n \tgit update-ref refs/heads/new HEAD &&\n-\ttest_config core.prefersymlinkrefs true &&\n-\tcat >stdin <<-EOF &&\n-\tstart\n-\tsymref-create TEST_SYMREF_HEAD refs/heads/new\n-\tprepare\n-\tcommit\n-\tEOF\n-\tgit update-ref --no-deref --stdin <stdin 2>stderr &&\n+\t# manually do this, as core.prefersymlinkrefs no longer\n+\t# affects how a symref is created (as a textual symref).\n+\tln -f -s refs/heads/new .git/TEST_SYMREF_HEAD &&\n \ttest_path_is_symlink .git/TEST_SYMREF_HEAD &&\n-\ttest \"$(test_readlink .git/TEST_SYMREF_HEAD)\" = refs/heads/new &&\n-\ttest_grep \"core\\.preferSymlinkRefs will be removed\" stderr\n+\techo refs/heads/new >expect &&\n+\tgit symbolic-ref TEST_SYMREF_HEAD >actual &&\n+\ttest_cmp actual expect\n+'\n+\n+test_expect_success 'core.prefersymlinkrefs gets a warning' '\n+\ttest_when_finished \"git symbolic-ref -d TEST_SYMREF_HEAD || :\" &&\n+\tgit update-ref refs/heads/new HEAD &&\n+\n+\ttest_config core.prefersymlinkrefs true &&\n+\tgit symbolic-ref TEST_SYMREF_HEAD refs/heads/new 2>stderr &&\n+\ttest_grep \"core\\.preferSymlinkRefs was removed\" stderr &&\n+\n+\tgit symbolic-ref -d TEST_SYMREF_HEAD &&\n+\tgit config core.prefersymlinkrefs false &&\n+\tgit symbolic-ref TEST_SYMREF_HEAD refs/heads/new 2>stderr &&\n+\ttest_grep ! \"core\\.preferSymlinkRefs was removed\" stderr &&\n+\n+\tgit symbolic-ref -d TEST_SYMREF_HEAD &&\n+\tgit config --unset core.prefersymlinkrefs &&\n+\tgit symbolic-ref TEST_SYMREF_HEAD refs/heads/new 2>stderr &&\n+\ttest_grep ! \"core\\.preferSymlinkRefs was removed\" stderr\n '\n \n-test_expect_success 'symref transaction supports false symlink config' '\n+test_expect_success 'symref transaction' '\n \ttest_when_finished \"git symbolic-ref -d TEST_SYMREF_HEAD || :\" &&\n \tgit update-ref refs/heads/new HEAD &&\n-\ttest_config core.prefersymlinkrefs false &&\n \tcat >stdin <<-EOF &&\n \tstart\n \tsymref-create TEST_SYMREF_HEAD refs/heads/new\n@@ -499,7 +513,7 @@ test_expect_success 'symref transaction supports false symlink config' '\n \tgit symbolic-ref TEST_SYMREF_HEAD >actual &&\n \techo refs/heads/new >expect &&\n \ttest_cmp expect actual &&\n-\ttest_grep ! \"core\\.preferSymlinkRefs will be removed\" stderr\n+\ttest_grep ! \"core\\.preferSymlinkRefs was removed\" stderr\n '\n \n test_done\n-- \n2.46.1-742-g4240f61078\n\n"},{"id":"503039","messageId":"20240918232825.2627999-4-gitster@pobox.com","threadId":"62140","inReplyTo":"20240918232825.2627999-1-gitster@pobox.com","subject":"[PATCH 3/4] refs: remove NO_SYMLINK_HEAD","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2024-09-18T23:28:24Z","receivedAt":"2024-09-18T23:28:33Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"This step is for Git 3.0.\n\nRemove the build-time setting NO_SYMLINK_HEAD that is used to\noverride the end-user supplied core.preferSymlinkRefs and force\nuse of textual symrefs, as core.preferSymlinkRefs is now gone\nand we use textual symrefs only.\n\nSigned-off-by: Junio C Hamano <gitster@pobox.com>\n---\n Makefile                            | 6 ------\n config.mak.uname                    | 3 ---\n configure.ac                        | 3 ---\n contrib/buildsystems/CMakeLists.txt | 2 +-\n 4 files changed, 1 insertion(+), 13 deletions(-)\n\ndiff --git a/Makefile b/Makefile\nindex 275a5ee3c9..029a468702 100644\n--- a/Makefile\n+++ b/Makefile\n@@ -81,9 +81,6 @@ include shared.mak\n #\n # Define NO_SYS_SELECT_H if you don't have sys/select.h.\n #\n-# Define NO_SYMLINK_HEAD if you never want .git/HEAD to be a symbolic link.\n-# Enable it on Windows.  By default, symrefs are still used.\n-#\n # Define NO_SVN_TESTS if you want to skip time-consuming SVN interoperability\n # tests.  These tests take up a significant amount of the total test time\n # but are not needed unless you plan to talk to SVN repos.\n@@ -1767,9 +1764,6 @@ ifdef OPEN_RETURNS_EINTR\n \tCOMPAT_CFLAGS += -DOPEN_RETURNS_EINTR\n \tCOMPAT_OBJS += compat/open.o\n endif\n-ifdef NO_SYMLINK_HEAD\n-\tBASIC_CFLAGS += -DNO_SYMLINK_HEAD\n-endif\n ifdef NO_GETTEXT\n \tBASIC_CFLAGS += -DNO_GETTEXT\n \tUSE_GETTEXT_SCHEME ?= fallthrough\ndiff --git a/config.mak.uname b/config.mak.uname\nindex d5112168a4..a38b152312 100644\n--- a/config.mak.uname\n+++ b/config.mak.uname\n@@ -238,7 +238,6 @@ ifeq ($(uname_O),Cygwin)\n \t\tNO_D_TYPE_IN_DIRENT = YesPlease\n \t\tNO_STRCASESTR = YesPlease\n \t\tNO_MEMMEM = YesPlease\n-\t\tNO_SYMLINK_HEAD = YesPlease\n \t\tNO_IPV6 = YesPlease\n \t\tOLD_ICONV = UnfortunatelyYes\n \t\t# There are conflicting reports about this.\n@@ -446,7 +445,6 @@ ifeq ($(uname_S),Windows)\n \tNEEDS_CRYPTO_WITH_SSL = YesPlease\n \tNO_LIBGEN_H = YesPlease\n \tNO_POLL = YesPlease\n-\tNO_SYMLINK_HEAD = YesPlease\n \tNO_IPV6 = YesPlease\n \tNO_SETENV = YesPlease\n \tNO_STRCASESTR = YesPlease\n@@ -661,7 +659,6 @@ ifeq ($(uname_S),MINGW)\n \tNEEDS_CRYPTO_WITH_SSL = YesPlease\n \tNO_LIBGEN_H = YesPlease\n \tNO_POLL = YesPlease\n-\tNO_SYMLINK_HEAD = YesPlease\n \tNO_SETENV = YesPlease\n \tNO_STRCASESTR = YesPlease\n \tNO_STRLCPY = YesPlease\ndiff --git a/configure.ac b/configure.ac\nindex d1a96da14e..307349f323 100644\n--- a/configure.ac\n+++ b/configure.ac\n@@ -1195,9 +1195,6 @@ AC_COMPILE_IFELSE([BSD_SYSCTL_SRC],\n GIT_CONF_SUBST([HAVE_BSD_SYSCTL])\n \n ## Other checks.\n-# Define NO_SYMLINK_HEAD if you never want .git/HEAD to be a symbolic link.\n-# Enable it on Windows.  By default, symrefs are still used.\n-#\n # Define NO_PTHREADS if we do not have pthreads.\n #\n # Define PTHREAD_LIBS to the linker flag used for Pthread support.\ndiff --git a/contrib/buildsystems/CMakeLists.txt b/contrib/buildsystems/CMakeLists.txt\nindex 832f46b316..d6bce22d34 100644\n--- a/contrib/buildsystems/CMakeLists.txt\n+++ b/contrib/buildsystems/CMakeLists.txt\n@@ -267,7 +267,7 @@ if(CMAKE_SYSTEM_NAME STREQUAL \"Windows\")\n \tendif()\n \tinclude_directories(${CMAKE_SOURCE_DIR}/compat/win32)\n \tadd_compile_definitions(HAVE_ALLOCA_H NO_POSIX_GOODIES NATIVE_CRLF NO_UNIX_SOCKETS WIN32\n-\t\t\t\t_CONSOLE DETECT_MSYS_TTY STRIP_EXTENSION=\".exe\"  NO_SYMLINK_HEAD UNRELIABLE_FSTAT\n+\t\t\t\t_CONSOLE DETECT_MSYS_TTY STRIP_EXTENSION=\".exe\" UNRELIABLE_FSTAT\n \t\t\t\tNOGDI OBJECT_CREATION_MODE=1 __USE_MINGW_ANSI_STDIO=0\n \t\t\t\tUSE_NED_ALLOCATOR OVERRIDE_STRDUP MMAP_PREVENTS_DELETE USE_WIN32_MMAP\n \t\t\t\tHAVE_WPGMPTR ENSURE_MSYSTEM_IS_SET HAVE_RTLGENRANDOM)\n-- \n2.46.1-742-g4240f61078\n\n"},{"id":"503040","messageId":"20240918232825.2627999-5-gitster@pobox.com","threadId":"62140","inReplyTo":"20240918232825.2627999-1-gitster@pobox.com","subject":"[PATCH 4/4] refs: remove the last remnants of core.preferSymlinkRefs","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2024-09-18T23:28:25Z","receivedAt":"2024-09-18T23:28:34Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"This step is for some time after Git 3.0.\n\nNow it is almost N years since we removed the support for the\nvariable at Git 3.0 boundary, it is time to remove the warning about\nthis ancient variable and the behaviour change we went through with\nit.\n\nThis concludes the journey to make sure we no longer create a\nsymbolic link to represent a symref, while still recognising\nexisting ones.\n\nSigned-off-by: Junio C Hamano <gitster@pobox.com>\n---\n Documentation/config/core.txt |  5 -----\n config.c                      |  5 -----\n environment.c                 |  1 -\n environment.h                 |  1 -\n refs/files-backend.c          |  5 -----\n t/t0600-reffiles-backend.sh   | 15 ++-------------\n 6 files changed, 2 insertions(+), 30 deletions(-)\n\ndiff --git a/Documentation/config/core.txt b/Documentation/config/core.txt\nindex a6f67cab27..1887da78e3 100644\n--- a/Documentation/config/core.txt\n+++ b/Documentation/config/core.txt\n@@ -285,11 +285,6 @@ CIFS/Microsoft Windows.\n +\n False by default.\n \n-core.preferSymlinkRefs (removed)::\n-\tInstead of the default \"symref\" format for HEAD and other\n-\tsymbolic reference files, use symbolic links.  The support\n-\tfor this variable was dropped in Git 3.0.\n-\n core.alternateRefsCommand::\n \tWhen advertising tips of available history from an alternate, use the shell to\n \texecute the specified command instead of linkgit:git-for-each-ref[1]. The\ndiff --git a/config.c b/config.c\nindex 56b5862e59..8693cd510d 100644\n--- a/config.c\n+++ b/config.c\n@@ -1445,11 +1445,6 @@ static int git_default_core_config(const char *var, const char *value,\n \t\treturn 0;\n \t}\n \n-\tif (!strcmp(var, \"core.prefersymlinkrefs\")) {\n-\t\tprefer_symlink_refs = git_config_bool(var, value);\n-\t\treturn 0;\n-\t}\n-\n \tif (!strcmp(var, \"core.logallrefupdates\")) {\n \t\tif (value && !strcasecmp(value, \"always\"))\n \t\t\tlog_all_ref_updates = LOG_REFS_ALWAYS;\ndiff --git a/environment.c b/environment.c\nindex 1d6c48b52d..2c3a60149b 100644\n--- a/environment.c\n+++ b/environment.c\n@@ -40,7 +40,6 @@ int has_symlinks = 1;\n int minimum_abbrev = 4, default_abbrev = -1;\n int ignore_case;\n int assume_unchanged;\n-int prefer_symlink_refs;\n int is_bare_repository_cfg = -1; /* unspecified */\n int warn_ambiguous_refs = 1;\n int warn_on_object_refname_ambiguity = 1;\ndiff --git a/environment.h b/environment.h\nindex 0148738ed6..6b595bd210 100644\n--- a/environment.h\n+++ b/environment.h\n@@ -127,7 +127,6 @@ extern int has_symlinks;\n extern int minimum_abbrev, default_abbrev;\n extern int ignore_case;\n extern int assume_unchanged;\n-extern int prefer_symlink_refs;\n extern int warn_ambiguous_refs;\n extern int warn_on_object_refname_ambiguity;\n extern char *apply_default_whitespace;\ndiff --git a/refs/files-backend.c b/refs/files-backend.c\nindex 1296272252..eef01fee06 100644\n--- a/refs/files-backend.c\n+++ b/refs/files-backend.c\n@@ -2983,11 +2983,6 @@ static int files_transaction_finish(struct ref_store *ref_store,\n \t\t\t}\n \t\t}\n \n-\t\t/* Warn against core.preferSymlinkRefs set to true */\n-\t\tif (update->new_target && prefer_symlink_refs)\n-\t\t\t/* we used to, but no longer, create a symlink here */\n-\t\t\twarning(\"core.preferSymlinkRefs was removed in Git 3.0\");\n-\n \t\tif (update->flags & REF_NEEDS_COMMIT) {\n \t\t\tclear_loose_ref_cache(refs);\n \t\t\tif (commit_ref(lock)) {\ndiff --git a/t/t0600-reffiles-backend.sh b/t/t0600-reffiles-backend.sh\nindex 4e517cdc13..4db86757ac 100755\n--- a/t/t0600-reffiles-backend.sh\n+++ b/t/t0600-reffiles-backend.sh\n@@ -480,22 +480,12 @@ test_expect_success SYMLINKS 'symlinks used as symrefs are still supported' '\n \ttest_cmp actual expect\n '\n \n-test_expect_success 'core.prefersymlinkrefs gets a warning' '\n+test_expect_success 'core.prefersymlinkrefs no longer gets a warning' '\n \ttest_when_finished \"git symbolic-ref -d TEST_SYMREF_HEAD || :\" &&\n \tgit update-ref refs/heads/new HEAD &&\n \n \ttest_config core.prefersymlinkrefs true &&\n \tgit symbolic-ref TEST_SYMREF_HEAD refs/heads/new 2>stderr &&\n-\ttest_grep \"core\\.preferSymlinkRefs was removed\" stderr &&\n-\n-\tgit symbolic-ref -d TEST_SYMREF_HEAD &&\n-\tgit config core.prefersymlinkrefs false &&\n-\tgit symbolic-ref TEST_SYMREF_HEAD refs/heads/new 2>stderr &&\n-\ttest_grep ! \"core\\.preferSymlinkRefs was removed\" stderr &&\n-\n-\tgit symbolic-ref -d TEST_SYMREF_HEAD &&\n-\tgit config --unset core.prefersymlinkrefs &&\n-\tgit symbolic-ref TEST_SYMREF_HEAD refs/heads/new 2>stderr &&\n \ttest_grep ! \"core\\.preferSymlinkRefs was removed\" stderr\n '\n \n@@ -512,8 +502,7 @@ test_expect_success 'symref transaction' '\n \ttest_path_is_file .git/TEST_SYMREF_HEAD &&\n \tgit symbolic-ref TEST_SYMREF_HEAD >actual &&\n \techo refs/heads/new >expect &&\n-\ttest_cmp expect actual &&\n-\ttest_grep ! \"core\\.preferSymlinkRefs was removed\" stderr\n+\ttest_cmp expect actual\n '\n \n test_done\n-- \n2.46.1-742-g4240f61078\n\n"},{"id":"503042","messageId":"beb10633-78d7-4fe3-a71b-73d5a4bbb5ac@gmail.com","threadId":"62140","inReplyTo":"20240918232825.2627999-1-gitster@pobox.com","subject":"Re: [PATCH 0/4] deprecating core.preferSymlinkRefs","fromName":"Derrick Stolee","fromEmail":"stolee@gmail.com","sentAt":"2024-09-18T23:38:52Z","receivedAt":"2024-09-18T23:38:54Z","isPatch":true,"sender":{"key":"stolee@gmail.com","avatar":"https://avatars.githubusercontent.com/u/570044?v=4"},"body":"On 9/18/24 7:28 PM, Junio C Hamano wrote:\n> Removal of support for core.preferSymlinkRefs at Git 3.0 boundary,\n> so that we only write textual symrefs for things like HEAD and\n> refs/remotes/origin/HEAD, and still understand symbolic links used\n> as symrefs in existing repositories, is a serious proposal this\n> patch series makes.\n\nI missed a lot of this discussion about 3.0, but I'm fascinated by\nthe prospect.\n\n> What I want people to think about is how to ensure quality of the\n> Git 3.0 phase.  We can iterate and polish the proposal phase with as\n> much time as we want to spend, just like any new feature.  But Git\n> 3.0 phase is with a solid deadline, and before that time, we cannot\n> remove the feature for real.  Would we cook such steps in 'next'\n> forever until the actual Git 3.0?  To those users who are running\n> 'next' based Git, it would mean that some of the changes the\n> breaking changes document listed would come a lot earlier to them.\n> On the other hand, unless we somehow have a way to expose willing\n> volunteers an early access to these \"big changes\", there is no way\n> for them to be as stable and tested.  We should not plan to scramble\n> and be able to perfect these changes between Git v3.0-rc0 and Git\n> v3.0 final.\n> \n> Or perhaps use the \"experimental.*\" configuration stored in the\n> user's ~/.gitconfig to let users opt into Git 3.0 features (one of\n> which may be that textual symrefs are always used regardless of the\n> core.preferSymlinkRefs setting)?  That way, we can merge these big\n> changes early without worrying about accidentally affecting the\n> end-user population.\nI do like the idea of having someone set 'feature.git3=true' in\ntheir global config and having that mean that they are ready to\naccept the Git 3.0 breaking changes as they are available in\na Git 2.x release. As much early testing as we can get would be\nbeneficial.\n\nThis would be a way to get your patches 2 & 3 into 'master' and\nreleased, but I'm not sure exactly how to keep patch 4 queued\nfor a potential future release. The best I could think of is to\nhave a long-running 'master-v3' branch that takes these cleanup\npatches and then merges ongoing 'master' changes into them. It\nwould be a gross history to manage, but it could potentially\nwork. It does lead to concerns as to how to communicate that a\nchange to 'master' has broken the 'master-v3' CI or how an\nincoming change could create conflicts with 'master-v3'.\n\nSorry I don't have full solutions for you. Only more problems.\n\nThanks,\n-Stolee\n\n"},{"id":"503043","messageId":"xmqqed5ga3pc.fsf@gitster.g","threadId":"62140","inReplyTo":"beb10633-78d7-4fe3-a71b-73d5a4bbb5ac@gmail.com","subject":"Re: [PATCH 0/4] deprecating core.preferSymlinkRefs","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2024-09-19T00:26:39Z","receivedAt":"2024-09-19T00:26:42Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Derrick Stolee <stolee@gmail.com> writes:\n\n> I do like the idea of having someone set 'feature.git3=true' in\n> their global config and having that mean that they are ready to\n> accept the Git 3.0 breaking changes as they are available in\n> a Git 2.x release. As much early testing as we can get would be\n> beneficial.\n>\n> This would be a way to get your patches 2 & 3 into 'master' and\n> released, but I'm not sure exactly how to keep patch 4 queued\n> for a potential future release.\n\nI actually am not worried about that one, i.e., \"Clean-up phase\",\neven less than I would worry about the \"Proposal phase\".  Cleaning\nup after the dust settles can be done at a leisurely pace after the\nbig version bump.\n\nI think the feature.git3 opt-in knob would be a nice approach.\nThanks.\n"},{"id":"503696","messageId":"ZvplBAl5DrcX-Q3u@pks.im","threadId":"62140","inReplyTo":"20240918232825.2627999-1-gitster@pobox.com","subject":"Re: [PATCH 0/4] deprecating core.preferSymlinkRefs","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-09-30T08:45:03Z","receivedAt":"2024-09-30T08:45:09Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"On Wed, Sep 18, 2024 at 04:28:21PM -0700, Junio C Hamano wrote:\n> Removal of support for core.preferSymlinkRefs at Git 3.0 boundary,\n> so that we only write textual symrefs for things like HEAD and\n> refs/remotes/origin/HEAD, and still understand symbolic links used\n> as symrefs in existing repositories, is a serious proposal this\n> patch series makes.\n\nI probably don't have have to say that I fully support dropping support\nfor the writing side of this :) I was also recently reminded that we\nstill have \".git/branches\", which I'd very much like to drop support for\nwith Git 3.0, too. I'll send a separate patch series for that soonish.\n\n> But at the same time, this is an RFC.  I wrote it to serve as a\n> candidate for BCP, a guide to those who want to add an entry to the\n> breaking changes document.  I think anything that is described in\n> the breaking changes document has to become a patch series that\n> spans multi-year effort, and that must be done with care.\n> \n>  - The proposal phase.  A breaking change is outlined, transition\n>    plan is given, and the first step of the transition (often,\n>    starting to give a warning and offering an alternative to the\n>    feature planned to be removed are involved) is presented.  The\n>    aim is that after N years, the user base will be aware of the\n>    upcoming removal and would already be prepared to be able to work\n>    with Git 3.0 that lacks the removed feature.\n> \n>    In this series, [Patch 1/4] does this.\n> \n>  - The Git 3.0 phase.  A breaking change is actually implemented.\n>    It optionally can offer help to those who procrastinated until\n>    the last-minute to break them, but the feature itself is gone.\n> \n>    In this series, [PATCH 2/4] and [Patch 3/4] do this.\n> \n>  - Clean-up phase.  If the previous phase added an additional\n>    transition help, after M years, such a help meant for transition\n>    would be removed.\n> \n>    In this series, [PATCH 4/4] does this.\n> \n> What I want people to think about is how to ensure quality of the\n> Git 3.0 phase.  We can iterate and polish the proposal phase with as\n> much time as we want to spend, just like any new feature.  But Git\n> 3.0 phase is with a solid deadline, and before that time, we cannot\n> remove the feature for real.  Would we cook such steps in 'next'\n> forever until the actual Git 3.0?  To those users who are running\n> 'next' based Git, it would mean that some of the changes the\n> breaking changes document listed would come a lot earlier to them.\n> On the other hand, unless we somehow have a way to expose willing\n> volunteers an early access to these \"big changes\", there is no way\n> for them to be as stable and tested.  We should not plan to scramble\n> and be able to perfect these changes between Git v3.0-rc0 and Git\n> v3.0 final.\n> \n> Or perhaps use the \"experimental.*\" configuration stored in the\n> user's ~/.gitconfig to let users opt into Git 3.0 features (one of\n> which may be that textual symrefs are always used regardless of the\n> core.preferSymlinkRefs setting)?  That way, we can merge these big\n> changes early without worrying about accidentally affecting the\n> end-user population.\n\nI guess you've split this out into a separate discussion by now at [1],\nright? I've already commented on that series, so I'm not going to repeat\nwhat I've said here :)\n\nPatrick\n\n[1]: <xmqq7cb77810.fsf@gitster.g>\n"},{"id":"503697","messageId":"ZvplHGpWxwRGWo_4@pks.im","threadId":"62140","inReplyTo":"20240918232825.2627999-2-gitster@pobox.com","subject":"Re: [PATCH 1/4] refs: deprecate core.preferSymlinkRefs","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-09-30T08:45:16Z","receivedAt":"2024-09-30T08:45:25Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"On Wed, Sep 18, 2024 at 04:28:22PM -0700, Junio C Hamano wrote:\n> diff --git a/refs/files-backend.c b/refs/files-backend.c\n> index c7f3f4e591..c40a248b9f 100644\n> --- a/refs/files-backend.c\n> +++ b/refs/files-backend.c\n> @@ -2025,6 +2025,8 @@ static int create_ref_symlink(struct ref_lock *lock, const char *target)\n>  \n>  \tif (ret)\n>  \t\tfprintf(stderr, \"no symlink - falling back to symbolic ref\\n\");\n> +\telse\n> +\t\twarning(\"core.preferSymlinkRefs will be removed in Git 3.0\");\n>  \treturn ret;\n>  }\n>  #endif\n\nThis string should probably be marked for translation, right?\n\nPatrick\n"},{"id":"503756","messageId":"xmqqttdx6m09.fsf@gitster.g","threadId":"62140","inReplyTo":"ZvplBAl5DrcX-Q3u@pks.im","subject":"Re: [PATCH 0/4] deprecating core.preferSymlinkRefs","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2024-09-30T18:21:10Z","receivedAt":"2024-09-30T18:21:13Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Patrick Steinhardt <ps@pks.im> writes:\n\n> I guess you've split this out into a separate discussion by now at [1],\n> right? I've already commented on that series, so I'm not going to repeat\n> what I've said here :)\n>\n> Patrick\n>\n> [1]: <xmqq7cb77810.fsf@gitster.g>\n\nYes, it seems that we are converging on that thread that we cannot\nafford to do the runtime switching thing, so when I have time to\nreroll this topic, I'll see how it actually works.\n\nThanks.\n"},{"id":"503761","messageId":"20240930192826.GA1803946@coredump.intra.peff.net","threadId":"62140","inReplyTo":"20240918232825.2627999-3-gitster@pobox.com","subject":"Re: [PATCH 2/4] refs: mostly remove core.preferSymlinkRefs","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2024-09-30T19:28:26Z","receivedAt":"2024-09-30T19:28:34Z","isPatch":true,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Wed, Sep 18, 2024 at 04:28:23PM -0700, Junio C Hamano wrote:\n\n> diff --git a/t/t0600-reffiles-backend.sh b/t/t0600-reffiles-backend.sh\n> index d369330562..4e517cdc13 100755\n> --- a/t/t0600-reffiles-backend.sh\n> +++ b/t/t0600-reffiles-backend.sh\n> [...]\n> @@ -468,26 +468,40 @@ test_expect_success POSIXPERM 'git reflog expire honors core.sharedRepository' '\n>  \tesac\n>  '\n>  \n> -test_expect_success SYMLINKS 'symref transaction supports symlinks' '\n> +test_expect_success SYMLINKS 'symlinks used as symrefs are still supported' '\n>  \ttest_when_finished \"git symbolic-ref -d TEST_SYMREF_HEAD || :\" &&\n>  \tgit update-ref refs/heads/new HEAD &&\n> -\ttest_config core.prefersymlinkrefs true &&\n> -\tcat >stdin <<-EOF &&\n> -\tstart\n> -\tsymref-create TEST_SYMREF_HEAD refs/heads/new\n> -\tprepare\n> -\tcommit\n> -\tEOF\n> -\tgit update-ref --no-deref --stdin <stdin 2>stderr &&\n> +\t# manually do this, as core.prefersymlinkrefs no longer\n> +\t# affects how a symref is created (as a textual symref).\n> +\tln -f -s refs/heads/new .git/TEST_SYMREF_HEAD &&\n\nThere are two other tests that probably should get the same treatment.\nIn the patch below I've just deleted them, but I think since they are\nreally about the reading side, they'd probably want a similar manual\nsetup.\n\ndiff --git a/t/t7201-co.sh b/t/t7201-co.sh\nindex 2d984eb4c6..72eb5f62e7 100755\n--- a/t/t7201-co.sh\n+++ b/t/t7201-co.sh\n@@ -407,18 +407,6 @@ test_expect_success 'checkout w/--track from tag fails' '\n \ttest \"z$(git rev-parse main^0)\" = \"z$(git rev-parse HEAD)\"\n '\n \n-test_expect_success 'detach a symbolic link HEAD' '\n-\tgit checkout main &&\n-\tgit config --bool core.prefersymlinkrefs yes &&\n-\tgit checkout side &&\n-\tgit checkout main &&\n-\tit=$(git symbolic-ref HEAD) &&\n-\ttest \"z$it\" = zrefs/heads/main &&\n-\there=$(git rev-parse --verify refs/heads/main) &&\n-\tgit checkout side^ &&\n-\ttest \"z$(git rev-parse --verify refs/heads/main)\" = \"z$here\"\n-'\n-\n test_expect_success 'checkout with --track fakes a sensible -b <name>' '\n \tgit config remote.origin.fetch \"+refs/heads/*:refs/remotes/origin/*\" &&\n \tgit update-ref refs/remotes/origin/koala/bear renamer &&\ndiff --git a/t/t9903-bash-prompt.sh b/t/t9903-bash-prompt.sh\nindex 95e9955bca..b4d7206bea 100755\n--- a/t/t9903-bash-prompt.sh\n+++ b/t/t9903-bash-prompt.sh\n@@ -50,15 +50,6 @@ test_expect_success 'prompt - branch name' '\n \ttest_cmp expected \"$actual\"\n '\n \n-test_expect_success SYMLINKS 'prompt - branch name - symlink symref' '\n-\tprintf \" (main)\" >expected &&\n-\ttest_when_finished \"git checkout main\" &&\n-\ttest_config core.preferSymlinkRefs true &&\n-\tgit checkout main &&\n-\t__git_ps1 >\"$actual\" &&\n-\ttest_cmp expected \"$actual\"\n-'\n-\n test_expect_success 'prompt - unborn branch' '\n \tprintf \" (unborn)\" >expected &&\n \tgit checkout --orphan unborn &&\n\n\nI noticed these because I had a similar proposal long ago, which never\ngot merged (I don't think because anybody particularly disagreed, but it\nfell through the cracks and never got picked up again):\n\n  https://lore.kernel.org/git/20151230065343.GA26964@sigill.intra.peff.net/\n\nWhat you have here is (modulo the two hunks above) more complete than\nwhat I have, so I don't think there's anything else to try to salvage\nfrom it. A little bit of the history in the linked commit message is\ninteresting as to how we ended up here, but ultimately not really that\nimportant.\n\n-Peff\n"},{"id":"503768","messageId":"xmqqttdw528t.fsf@gitster.g","threadId":"62140","inReplyTo":"20240930192826.GA1803946@coredump.intra.peff.net","subject":"Re: [PATCH 2/4] refs: mostly remove core.preferSymlinkRefs","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2024-09-30T20:13:22Z","receivedAt":"2024-09-30T20:13:24Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Jeff King <peff@peff.net> writes:\n\n> I noticed these because I had a similar proposal long ago, which never\n> got merged (I don't think because anybody particularly disagreed, but it\n> fell through the cracks and never got picked up again):\n>\n>   https://lore.kernel.org/git/20151230065343.GA26964@sigill.intra.peff.net/\n>\n> What you have here is (modulo the two hunks above) more complete than\n> what I have, so I don't think there's anything else to try to salvage\n> from it. A little bit of the history in the linked commit message is\n> interesting as to how we ended up here, but ultimately not really that\n> important.\n\nIt was useful to find out another reason (which I failed to mention\nin this series) why symbolic links will be misleading: when it points\nat a ref that is in packed-refs.\n\nThanks.\n"}]}