出于某种原因,我想在我的存储库中有一个空文件。该文件需要存在,但构建过程会更改它,我不希望提交这些更改。我需要克隆我的存储库的用户也忽略对此文件的更改。
git update-index --assume-unchanged
似乎很好,但它只能在本地使用。
你知道我怎么解决这个问题吗?
答案 0 :(得分:4)
设置repo以保存文件的特定已提交状态很容易,并且您可以拒绝任何您不喜欢的入站。
保留文件的特定已提交状态:
# do this once when the committed path/to/file is in the state you want
x=`git rev-parse master:path/to/file`
echo path/to/file filter=wired-to-$x >>.gitattributes
# then in each repo that wants it
git config filter.wired-to-$x.clean "git show $x"
预接收挂钩测试入站推送,这个简单的
#!/bin/sh
set -e
while read old new ref; do
git ls-tree $new path/to/file \
| awk '$3 != "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391" {
print "path/to/file is not empty"; exit 1; }'
done
将拒绝任何包含带有非空路径/ /文件的入站分支提示的推送。在你的“$ x”中检查你想要的状态,为了增加彻底性,你可以通过内部rev-list循环来运行ls-tree来运行所有的inbounds。
答案 1 :(得分:4)
mentioned的清洁过滤方式jthill是正确的方法。 1
每次将文件“添加”到索引时强制恢复文件(意味着它实际上从未添加过,因为它没有更改)。
问题:如何强制用户定义它?
解决方案:让他们克隆模板仓库,其已包含:
.gitattributes
文件,其中声明了清洁过滤器如果您将主要的集中式回购设置为拒绝不是快进版本(git config receive.denyNonFastForwards true
)的参考更新,那么您的用户将无法做出选择,只能从具有相同共同历史记录的回购中推送比你的模板回购。
这意味着他们将拥有这些设置。
当然,他们可以在新提交中删除所述设置,但这是从jthill的答案中pre-receive
挂钩开始的时候。
如果他们不需要知道这些文件,他们很可能不会搞乱已经为他们定义的内容。
答案 2 :(得分:1)
如果他们没有git add
更改的文件,那么这不是问题。教他们不要使用git add .
,它接近等价物Difference of “git add -A” and “git add .”。
项目自述文件还可以包含您对相关文件的git update-index --assume-unchanged
指令
答案 3 :(得分:1)
这似乎是一个应用程序的任务,而不是git的。我会将此文件添加到.gitignore,并确保构建过程或使用它的任何其他过程都可以创建它。