有git"假设不变"每个人的文件,而不仅仅是本地文件

时间:2015-10-23 15:03:57

标签: git

我有一些部分生成的文件foo,我希望在初始状态下检入存储库,但我不希望任何更改被git注意到。

我认为将它放在.gitignore文件中git add -f foo就足够了,但git statusgit diff显示foo和git add .的变化添加它。无论如何我能做到吗?

git update-index --assume-unchanged foo 之类的东西,但是每个人都自动拥有它,而不仅仅是本地

  

后见之明编辑:在处理类似问题一段时间之后,--skip-worktree优于--assume-unchanged,请参阅this question了解原因。神奇地使它适用于每个人的问题仍然存在。

为了更具体一点,它是一个跟踪内存数据库的文件,用于需要行CREATE USER SA PASSWORD ""GRANT DBA TO SA的单元测试,如果我在删除此文件时它重新生成那些线不在那里。它跟踪运行之间数据库的状态,这就是我不希望将更改检入存储库的原因。

我知道这是一个奇怪的情况,并且弄清楚如何使用这些线生成或不跟踪状态可能是更好的解决方案。

重现的步骤

mkdir test
cd test
git init

echo "hey" > foo
git add .
git commit -m "Add hey to foo"

echo "foo" > .gitignore
git add .
git commit -m "Ignore foo"

echo "bye" > foo
git diff          # will show foo's change
git status        # will show foo has changed
git add .         # will add foo's change to index

3 个答案:

答案 0 :(得分:1)

您可以创建初始文件的副本并将其放在存储库中的其他位置,以便您的工具不会更改副本。然后,在您的构建脚本或测试脚本中,它可以将其复制到正确的位置(git可能会忽略它)并随意修改。

它不是一个完美的git解决方案,但运行git mv tests/foo test-templates/ && echo "tests/*" >> .gitignore并在构建或测试脚本中添加cp test-templates/foo tests/应该是一个非常简单的更改。

答案 1 :(得分:1)

这有点像黑客攻击,但它只是一个可用的git解决方案。

  1. 创建一个仅包含此文件的新存储库,并将此新存储库作为submodule包含在主存储库中。
  2. 使用此新子模块的ignore=dirty标记修改主存储库中的.gitmodules
  3. 现在,当修改此文件时,子模块将被标记为脏,但是在检查git status时,使用存储库的人将看不到标记为脏的子模块。更重要的是,他们可以随意拉动和推送,而无需共享对子模块中文件所做的更改。

答案 2 :(得分:1)

仅使用git无法做到这一点。