我正处于我想要开源我的项目的情况,但是我想要发布一个“干净”版本的单个源文件,但在本地使用单独的版本。 git是否有一个我可以只提交一次文件的功能,它从现在开始停止查找该文件的更改?
我已尝试将该文件添加到.gitignore,但是在我第一次对文件执行git add -f
和git commit
之后,我又继续编辑它,{{1} }将文件显示为已更改。理想的行为是git不会显示此文件从现在开始改变,即使我已经编辑过它。
我还感兴趣的是,在推送到开源代码库之前,其他人如何处理“清理”他们的私有代码/数据代码库,尤其是在Git上。
答案 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-index
,here 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,则会丢失)。