【问题标题】:Ignore changes to a tracked file without making it impossible to `git add` the file忽略对跟踪文件的更改,而不会使文件无法“git add”
【发布时间】:2014-05-04 11:36:50
【问题描述】:

您可以跳过序言。


我有一个结构如下的 npm 包:

lib/index.js
src/index.coffee

源文件是一个 CoffeeScript 文件。我有一个用于从源文件构建 JavaScript 文件的 make 目标。直到最近,我在每次提交中都包含了对 JavaScript 文件的更改,但我现在使用 xyz 和预发布脚本:

XYZ = node_modules/.bin/xyz --script scripts/prepublish

.PHONY: release-major release-minor release-patch
release-major: LEVEL = major
release-minor: LEVEL = minor
release-patch: LEVEL = patch

release-major release-minor release-patch
    @$(XYZ) --increment $(LEVEL)

预发布脚本很简单:

#!/usr/bin/env bash
set -e

rm -f   lib/index.js
make    lib/index.js
git add lib/index.js

这意味着每次我发布一个新版本(例如,通过运行make release-patch),lib/index.js 都会被重建并添加到发布提交中。到目前为止一切正常。


由于发布脚本会自动更新编译后的文件,我不再希望每次提交时都手动更新它。问题是在运行make test 之后,git statuslib/index.js 列为修改后的跟踪文件。我想避免意外提交这个文件,所以我想防止它被git status列出。

我尝试的第一件事是将/lib/ 添加到.gitignore。但是,这不起作用,因为 lib/index.js 已经被跟踪了。

然后我发现了git update-index --assume-unchanged。我以lib/index.js 作为参数运行了这个命令,而git status 不再列出该文件。到目前为止,一切都很好。但现在,git add lib/index.js 不再有效,因此预发布脚本将无法完成其工作。

我相信预发布脚本可以在git add 之前运行git update-index --no-assume-unchanged lib/index.js,然后可以使用git update-index --assume-unchanged lib/index.js 恢复该位。这真的是最好的方法吗?

总而言之,如何忽略对跟踪文件的更改,同时保留git add 文件的能力?

【问题讨论】:

    标签: git git-index


    【解决方案1】:

    只需检查 git add -f (git add --force) 是否能够添加文件而无需取消设置 assume-unchanged 位。

    如果这不起作用,那么:

    我相信预发布脚本可以在git add 之前运行git update-index --no-assume-unchanged lib/index.js,然后可以使用git update-index --assume-unchanged lib/index.js 还原该位。

    使用这种方法,您可以做到最好。

    唯一的其他方法是git update-index --(no-)skip-worktree lib/index.js(即I present here),但在您的情况下,这将是相同的。

    【讨论】:

    • 谢谢,@VonC。不幸的是,git add -f lib/index.js 无效。如果我遇到assume-unchanged 的问题,我会看看skip-worktree 是否是一个更好的选择。我不清楚这两种方法有何不同(即使阅读了对relevant question 的回复)。
    猜你喜欢
    • 2015-11-21
    • 1970-01-01
    • 2012-06-01
    • 2014-07-03
    • 2015-09-27
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 2011-10-30
    相关资源
    最近更新 更多