如何选择不将某些文件/文件夹从Git存储库拉到我的本地副本

时间:2013-12-16 21:19:51

标签: git

我正在使用Gekub页面和Jekyll,我正在使用插件来生成搜索索引。该插件不能在Github上运行,但它确实在我们这些使用Mac的本地实例上运行,并作为Linux服务器上的每日cron作业运行。我遇到的问题是许多贡献者使用Windows,并且该插件不能在Windows上运行,也不允许Jekyll启动。所以,我想做的是阻止Windows用户拉动_plugins文件夹,Gemfile,_config.yml以及其他一些文件和文件夹,同时仍然将所有这些内容同步到Mac和Linux机器上,以及继续使用Github作为所有这些的主存储库,包括插件。

我尝试过.gitignore(使用整个git update-index --assume-unchanged事物,然后在本地更改文件/文件夹),但这只是为了防止本地更改被推送到主存储库,如果有人更改了其中一个不需要的文件,他们将在下次拉动时检索。

关于如何解决这个问题的任何想法?

2 个答案:

答案 0 :(得分:1)

如果你只拥有一把锤子......

如果您至少拥有Git 1.7,则可以使用Sparse checkout。这是some more information

真的,使用Git来修复损坏的代码听起来像个坏主意。也许有人会有更有用的建议。

答案 1 :(得分:0)

没有内置的东西(可能应该有 - 解决不区分大小写和区分大小写的主机文件系统问题的方法)。

在底层,你通常根本不想这样做。原因是git不按文件 name 存储文件。相反,它通过内容存储数据。它将所有数据 - 无论是某些实际文件内容(git称为“blob”),还是“commit”或其他两个内部数据结构中的任何一个转换为唯一的SHA-1值。

这里感兴趣的部分是另外两个数据结构之一,即“树”。 (最后一个是“带注释的标签”,或者有时只是“标签”,但普通的“标签”可能与存储库对象数据库之外的轻量级标签混淆。)它是提供提交中每个blob的名称。

您可以在section 9.2 of the Git Book中查看将文件,树和提交输入git存储库的过程。

git需要什么,但没有,是修改“存储库中的树对象中的名称”和“文件系统中的名称”之间的映射的一种简单方便的方法主持人持有工作目录“。 可以在两个方向上完成。上面的Git Book链接显示了如何“在路上”(获取本地文件并为它们提供与其磁盘名称不同的树名称)。它不那么痛苦 - 但仍然没有痛苦 - 在“出路”时做到这一点。特别是,您可以设置git调用"sparse checkout" mode以避免检查大多数内容;然后您可以使用git show以不同的名称提取单个文件:

git show HEAD:path/to/foo > different-name

如有必要。

如果有某种方法来设置映射,您可以执行以下操作:

cp mappings/windows-map > .git/info/filemap # NOTE: I MADE THIS UP

(其中mappings/windows-map会说回购名称_config.yml应该转换为工作文件名not-for-use-on-windows/_config.yml。这甚至可以让你编辑文件并提交它,反转映射。但是没有,所以你不能。

相关问题