Git 如何在更改分支时删除一些被忽略的文件

Git how to delete some ignored files when changing branch

我的项目有两个版本的代码,一个 "maintenance" 和一个 "new" 用于更新版本。

我想在这些分支中忽略我代码中的所有 *.min.js 文件。一些 .js 文件在 "new" 但不在 "maintenance" 中。每次编辑 .js 文件时,Eclipse 都会生成 .min.js 。

问题是,当我在分支 "new" 并切换到分支 "maintenance" 时,新生成的缩小 js 仍然没有维护中的 .js 文件那里。

有没有办法告诉 git 在切换到维护时删除这些文件?

我想在 gitattributes 中定义合并策略而不是忽略 .min.js 文件,但 Eclipse 不处理 gitattriutes。

切换到new分支后,可以运行以下命令使工作树匹配HEAD状态

git reset --hard && git clean -dfx

未跟踪文件的全部意义在于 Git 对其一无所知。 Git 因此也不知道 删除 它。

Git 是否提供了一种通用机制,让您 运行 在每个 git checkout 之后进行自己的操作,即所谓的 post-结帐挂钩。 (我不知道你的 Eclipse IDE 是否遵守相同的协议。)post-checkout 挂钩只是任何名为 .git/hooks/post-checkout 的可执行文件1 ]. Git 将 运行 它,在每个 git checkout.

之后带有 the githooks documentation 中描述的一些参数

因为git checkout可以用于不属于的操作更改HEAD附加的分支名称,您需要测试您认为合适的任何条件。例如,您可以检查第三个参数,即文档中称为 flag 的参数。如果已设置,则该命令是修改 HEAD 绑定到的提交或分支名称的操作。如果 HEAD 现在绑定到一个提交或分支,其中一些 *.min.js 文件应该被删除(如果存在),您现在可以删除它们(如果存在)。如果 HEAD 现在绑定到一个提交或分支,其中一些 *.min.js 文件如果不存在则应该创建,如果它们不存在,您现在可以创建它们。

这样的脚本可能看起来像这样,尽管您需要填写缺少的部分:

#! /bin/sh
# Post-checkout hook to deal with `*.min.js` files.

# If flag is not 1, do nothing (and succeed).
if [ "" != 1 ]; then exit 0; fi

# Otherwise, determine whether there are *.min.js files that need to
# be created and/or removed.  The code below is meant to be illustrative,
# not efficient.

for file in $(compute files that should be removed); do rm -f "$file"; done
for file in $(compute files that should be created); do create_minified "$file"; done

exit 0 # always report success, regardless of actual success

最后一行很重要:Git 文档声称 post-checkout 挂钩不会影响 git checkout 的结果,但事实上,post-checkout hook 设置 git checkout 本身的退出状态。如果您的 post-checkout hook 报告失败状态,git checkout 将报告失败状态,这可能会误导更大的自动化系统。这可能是好事也可能是坏事,具体取决于您的观点,因此虽然最后一行 重要 ,但对于您的特定应用而言不一定 正确 .


1一个可执行文件,这里必须是实际可执行文件。也就是说,它不仅需要设置 x 位(在类 Unix 系统上,使用 chmod +xchmod 755 或类似设置可执行位),它必须是 可通过execve系统调用直接执行。对于类 Unix 系统上的脚本,这意味着脚本必须以像 #! /bin/sh#! /usr/bin/env bash 这样的行开头,其中 #! 之后的路径名是解释器的路径名。 Python 脚本可以通过 #! /usr/bin/env python#! /usr/bin/env python3.6 等方式执行,具体取决于您需要调用哪个 Python 解释器。