有没有办法在Git中“冻结”文件?

时间:2011-01-17 05:25:02

标签: git

我正处于我想要开源我的项目的情况,但是我想要发布一个“干净”版本的单个源文件,但在本地使用单独的版本。 git是否有一个我可以只提交一次文件的功能,它从现在开始停止查找该文件的更改?

我已尝试将该文件添加到.gitignore,但是在我第一次对文件执行git add -fgit commit之后,我又继续编辑它,{{1} }将文件显示为已更改。理想的行为是git不会显示此文件从现在开始改变,即使我已经编辑过它。

我还感兴趣的是,在推送到开源代码库之前,其他人如何处理“清理”他们的私有代码/数据代码库,尤其是在Git上。

5 个答案:

答案 0 :(得分:19)

您可以使用Git的sparse checkout功能执行此操作。在repo中运行以下命令,您需要一个特殊的,未跟踪的local.txt文件:

git config core.sparsecheckout true
echo '*' >.git/info/sparse-checkout
echo '!local.txt' >>.git/info/sparse-checkout
git read-tree --reset -u HEAD

这将首先删除现有的local.txt文件。但现在从Git的角度来看它被忽略了,所以你可以把机器特定的那个放在那里,Git不会打扰你。

然后,您可以从某些其他存储库添加和管理已发布的local.txt文件。 Git很乐意跟踪这个文件并将其保存在存储库中,但是在具有上述稀疏checkout配置的机器上,Git将忽略该工作目录中的本地local.txt文件,甚至如果它与存储库中的内容不同。

答案 1 :(得分:7)

使用update-indexhere are the docs

以下是冻结文件foo.rb的基本示例:

git update-index --assume-unchanged foo.rb

然后,把它拿回来:

git update-index --no-assume-unchanged foo.rb

为简单起见,请将其添加到.gitconfig

freeze = update-index --assume-unchanged
thaw = update-index --no-assume-unchanged
...
git freeze foo.rb
git thaw foo.rb

注意:此答案最初由@TheAmpersand在上面的评论中提供。我认为形式化很重要。

答案 2 :(得分:5)

Greg的方法非常恰当地回答了你的问题。

让我做一个补充,考虑到我推断的高级目标:

  • 不要将本地数据发布到野外
  • 将一个干净的版本发布到野外

最简单的(以我的经验,最好的证明)方法来实现这一点是使用以下结构:

版本化

./application.code
./config.code
./config.local.code.sample
./.gitignore

<强> application.code

include('./config.code')
if is_file('./config.local.code')
  include('./config.local.code')
end

<强> config.code

username = 'root'
password = 'password'

<强> config.local.code.sample

username = 'replace with your local username and rename file to config.local.code'
password = 'replace with your local password and rename file to config.local.code'

<强>的.gitignore

config.local.code

无版本(可选)

./config.local.code # will not be picked up by git due to .gitignore

<强> config.local.code

username = 'Suan'
password = 'myownpass'

结果

正如您所看到的,您可以避免将实际包含敏感信息的config.local.code发布到野外。默认配置(直接从远程克隆)将适用于用户root和密码password有效的合理(如果罕见)情况。名称恰当的config.local.code.sample提供本地自定义指令。

答案 3 :(得分:0)

一种方法是在本地分支中对该文件进行更改。在那个分支中做你的工作,然后将你的更改忽略回发展正在发生的实际分支。

答案 4 :(得分:0)

我通过使用符号链接解决了Django中配置文件的类似情况。看来你正在寻找版本控制功能而不是配置文件管理,但我确信这个小策略可以提供帮助。以下是我通常采取的步骤:

假设您要在本地更新(而不是共享)的文件名为“local.file”,而您希望发布的文件(在野外)是“release.file”...您需要创建一个符号链接文件,让我们称这个符号链接文件'actual.file'。符号链接文件将在任何给定时间指向local.file或release.file(如果您刚刚克隆了repo,则会丢失)。

      
  1. gitignore local.file和actual.file因此不会跟踪它们,因为您不希望跟踪或释放它们。 actual.file始终指向您要使用的文件。
  2.   
  3. 当您处理“非冻结”版本文件时,使符号链接指向local.file。
  4.   
  5. 当您想要对其进行手动更新或只是将更改从local.file复制到release.file时,使符号链接(actual.file)指向'frozen'prolease.file。