From 7a284d39d446ccbecbe9a6ab1e4884bd0dac6822 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Fri, 11 Apr 2025 19:28:44 +0200 Subject: [PATCH 1/2] Ensure git checkout works with untracked files Closes #14425. --- lib/mix/lib/mix/scm/git.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mix/lib/mix/scm/git.ex b/lib/mix/lib/mix/scm/git.ex index e59c6c29826..cb2c29f5c35 100644 --- a/lib/mix/lib/mix/scm/git.ex +++ b/lib/mix/lib/mix/scm/git.ex @@ -141,7 +141,7 @@ defmodule Mix.SCM.Git do # Migrate the Git repo rev = lock_rev || get_origin_opts_rev(opts) || default_branch() - git!(["--git-dir=.git", "checkout", "--quiet", rev]) + git!(["--git-dir=.git", "checkout", "--force", "--quiet", rev]) if opts[:submodules] do git!(~w[-c core.hooksPath='' --git-dir=.git submodule update --init --recursive]) From b6e9edd4e9d784c820e414cf5c9f8391e822b04f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Fri, 25 Apr 2025 14:36:24 +0200 Subject: [PATCH 2/2] Add tests --- lib/mix/test/mix/tasks/deps.git_test.exs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/mix/test/mix/tasks/deps.git_test.exs b/lib/mix/test/mix/tasks/deps.git_test.exs index 42559acb7cc..c2e97ffc4f4 100644 --- a/lib/mix/test/mix/tasks/deps.git_test.exs +++ b/lib/mix/test/mix/tasks/deps.git_test.exs @@ -400,9 +400,14 @@ defmodule Mix.Tasks.DepsGitTest do Mix.State.clear_cache() purge([DepsOnGitRepo.MixProject]) + # Write to the checkout location to ensure it is replaced + File.mkdir_p!("deps/deps_on_git_repo/lib") + File.write!("deps/deps_on_git_repo/lib/deps_on_git_repo.ex", "# WILL BE OVERRIDDEN") + Mix.Tasks.Deps.Update.run(["deps_on_git_repo"]) assert File.exists?("deps/git_repo/lib/git_repo.ex") assert File.read!("mix.lock") =~ last + assert File.read!("deps/deps_on_git_repo/lib/deps_on_git_repo.ex") =~ "GitRepo.hello()" refute File.exists?("_build/dev/lib/git_repo/.mix/compile.fetch") end) after @@ -427,10 +432,15 @@ defmodule Mix.Tasks.DepsGitTest do Mix.State.clear_cache() purge([DepsOnGitRepo.MixProject]) + # Write to the checkout location to ensure it is replaced + File.mkdir_p!("deps/deps_on_git_repo/lib") + File.write!("deps/deps_on_git_repo/lib/deps_on_git_repo.ex", "# WILL BE OVERRIDDEN") + Mix.Dep.Lock.write(%{deps_on_git_repo: {:git, fixture_path("deps_on_git_repo"), last, []}}) Mix.Tasks.Deps.Get.run([]) assert File.exists?("deps/git_repo/lib/git_repo.ex") assert File.read!("mix.lock") =~ last + assert File.read!("deps/deps_on_git_repo/lib/deps_on_git_repo.ex") =~ "GitRepo.hello()" refute File.exists?("_build/dev/lib/git_repo/.mix/compile.fetch") end) after