如何在git-svn dcommit时排除.git*文件不提交至SVN仓库
解决git-svn本地追踪.gitignore/.gitattributes但不推送到SVN的问题
嘿,刚好我之前处理过一模一样的git-svn场景,给你几个实用的方案,完美匹配你的需求:
方法1:配置git-svn的忽略路径(首推!持久又省心)
你可以直接给git-svn加个专属规则,让它执行dcommit时自动跳过这两个文件。在本地仓库根目录跑下面这行命令就行:
git config svn-remote.svn.ignore-paths "^\\.gitignore$|^\\.gitattributes$"
这里的正则表达式专门匹配根目录下的.gitignore和.gitattributes,dcommit的时候git-svn会自动无视它们,完全不会推到SVN仓库里。要是你的这两个文件在子目录里,比如src/下,就把正则改成^src/\\.gitignore$|^src/\\.gitattributes$就行,灵活调整。
方法2:用assume-unchanged标记(适合临时场景)
如果只是临时不想推这两个文件,或者想保留本地修改但暂时不提交到SVN,可以给这两个文件打个“假不变”标记:
git update-index --assume-unchanged .gitignore .gitattributes
这样git会认为这俩文件没改动,dcommit自然不会管它们。之后要是哪天需要取消这个限制(虽然你说绝不能提交,但留个退路总没错),就跑:
git update-index --no-assume-unchanged .gitignore .gitattributes
不过这个方法有个小缺点:切换分支或者拉SVN更新后,可能得重新标记,不如方法1持久。
方法3:smudge/clean过滤器(进阶玩法,一般用不上)
要是你的.gitattributes本身是用来做文件格式转换的,还能通过git的过滤器机制,让git-svn在dcommit时“隐身”这两个文件。不过这个配置起来有点繁琐,方法1已经足够解决问题了,就不多展开啦。
小提醒
别忘了先在本地Git仓库里提交这两个文件哦:
git add .gitignore .gitattributes && git commit -m "Add git ignore and attributes files"
这样本地就能正常追踪它们的变更,同时SVN那边完全看不到它们的存在。
内容的提问来源于stack exchange,提问作者Johann Studanski




