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

Sua*_*uan 21 git

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

我试图加入的.gitignore文件,但是当我做了第一次后git add -f,并git commit在文件上,我进行再次编辑,git status文件显示为改变.理想的行为是git不会显示此文件从现在开始改变,即使我已经编辑过它.

我也对其他人如何处理"擦洗"他们的私有代码/数据代码库之前感兴趣,然后推送到开源代码库,特别是在Git上.

Gre*_*ill 19

你可以使用Git的稀疏结账功能来完成这项工作.在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
Run Code Online (Sandbox Code Playgroud)

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

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

  • @foo:确定,编辑`.git/info/sparse-checkout`文件,删除`!local.txt`行,然后重新运行`git read-tree`命令. (3认同)
  • 我发现这种方法非常强大.我见过的其他方法比使用`git update-index --assume-unchanged`或`git update-index --skip-worktree`更多.干杯! (2认同)

ynk*_*nkr 8

使用update-index,这是文档.

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

git update-index --assume-unchanged foo.rb
Run Code Online (Sandbox Code Playgroud)

然后,把它拿回来:

git update-index --no-assume-unchanged foo.rb
Run Code Online (Sandbox Code Playgroud)

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

freeze = update-index --assume-unchanged
thaw = update-index --no-assume-unchanged
...
git freeze foo.rb
git thaw foo.rb
Run Code Online (Sandbox Code Playgroud)

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


Ste*_*ven 5

格雷格的方法非常充分,准确地回答了你的问题.

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

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

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

版本化

./application.code
./config.code
./config.local.code.sample
./.gitignore
Run Code Online (Sandbox Code Playgroud)

application.code

include('./config.code')
if is_file('./config.local.code')
  include('./config.local.code')
end
Run Code Online (Sandbox Code Playgroud)

config.code

username = 'root'
password = 'password'
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)

的.gitignore

config.local.code
Run Code Online (Sandbox Code Playgroud)

无版本(可选)

./config.local.code # will not be picked up by git due to .gitignore
Run Code Online (Sandbox Code Playgroud)

config.local.code

username = 'Suan'
password = 'myownpass'
Run Code Online (Sandbox Code Playgroud)

结果

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


Yul*_*liy 0

一种方法是在本地分支中对该文件进行更改。在该分支中完成您的工作,然后将忽略您的更改的变基重新设置回正在发生开发的实际分支。