我有一个项目,其中包含我的代码的两个版本,一个是“维护”,一个是“新”,用于较新的版本。
我想忽略这些分支中代码中的所有* .min.js文件。某些.js文件位于“新建”中,而不位于“维护”中。每次编辑.js文件时,Eclipse都会生成.min.js。
问题是,当我在“ new”分支上并切换到“ maintenance”分支时,在new中生成的缩小的js和没有维护其.js文件的js仍然存在。
在切换到维护时,有没有办法告诉git删除这些文件?
我想在gitattributes中定义合并策略,而不是忽略.min.js文件,但是Eclipse不处理gitattriutes。
答案 0 :(得分:1)
未跟踪文件的全部要点是,Git对它一无所知。因此,Git也无法知道删除。
Git 确实提供了一种通用机制,可让您在每个git checkout
之后运行自己的操作,即所谓的结帐后挂钩。 (无论您的Eclipse IDE是否遵循相同的协议,我都不知道。)结帐后挂钩仅仅是名为.git/hooks/post-checkout
的任何可执行文件 1 。在每个git checkout
之后,Git将使用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 [ "$3" != 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文档声称结帐后挂钩不能影响git checkout
的结果,但是实际上,结帐后挂钩的退出状态设置了{{ 1}}本身。如果您的结帐后挂钩报告了故障状态,则git checkout
将报告故障状态,这可能会误导大型自动化系统。这可能是好事,也可能是坏事,具体取决于您的观点,因此,尽管最后一行是重要,但对于您的特定应用程序,它不一定正确。
1 此处的可执行文件必须是实际上可执行的。也就是说,它不仅需要设置git checkout
位(在类Unix系统上,使用x
或chmod +x
或类似的方法来设置可执行位),它还必须< em>可通过chmod 755
系统调用直接执行。对于类Unix系统上的脚本,这意味着脚本必须以execve
或#! /bin/sh
之类的行开头,其中#! /usr/bin/env bash
之后的路径名是解释器的路径名。可以通过#!
或#! /usr/bin/env python
等使Python脚本可执行,具体取决于您需要调用哪个Python解释器。
答案 1 :(得分:0)
切换到new
分支后,可以运行以下命令以使工作树与HEAD状态匹配。
git reset --hard && git clean -dfx