在进行部分克隆时,Git子树没有正确使用.gitignore

时间:2010-03-23 21:37:28

标签: git version-control split gitignore subtree

我是一名研究生,有许多脚本,bibtex的书目数据,乳胶论文草稿,开放式办公室的演示文稿,涂鸦的海报,以及数据和结果数据。我想将所有内容放在版本控制下的一个项目中。然后,当我需要处理诸如参考书目数据之类的部分时,我想检查该子目录,根据需要进行修改并将其合并。我希望能够将一个版本签出到我的家用计算机,并且与我的工作计算机不同,并对每个计算机进行独立更改,并最终将它们合并。我还希望能够从这个大项目中查看一段代码并将其与版本导入一个单独的项目中。如果我可以改变,我希望能够将它们合并回原始项目。

根据我的理解,git子树可以做到这一点。

http://github.com/apenwarr/git-subtree

有一个例子与我正在尝试做的一致:

http://psionides.jogger.pl/2010/02/04/sharing-code-between-projects-with-git-subtree/

假设我项目的主干包含目录:(bib bin cfg data fig src todo)。

当我使用

git subtree split -P bib -b export
git checkout export

我得到一个bib目录,加上所有应该被忽略的文件或者基于.gitignore的二进制文件,例如src目录,以及以字母结尾或./结尾的所有内容。数据目录。

dwickrama@DWwork:~/research/trunk$ ls * -r
biblography.bib  JabRef

src:
script1.sh~ README~         script2.sh~
script3.sh~ script4.R~  script5.awk~
script5.py~ 

cfg:
cfgFile1.ini~  cfgFile2.ini~  cfgFile3.ini~

bin:
bigBinaryPackage1   bigBinaryPackage2

dwickrama@DWwork:~/research/trunk$ 

我的.gitignore文件如下:

*.doc diff=word
*.tex diff=tex
*.bib diff=bibtex
*.py diff=python
*.eps binary
*.jpg binary
*.png binary
./bin/* binary
*~

如何防止这种情况?

3 个答案:

答案 0 :(得分:4)

在我看来,所有这些被忽略的文件实际上都不在您的回购中 - 它们只是您之前结帐时的剩余文件。

由于您从原始项目中提取了特定子树,因此您的.gitignore文件不再存在,因此不再“忽略”这些文件,因此您将看到它们处于git状态。但它们也不属于你的回购;他们只是坐在那里。

尝试使用'git clean'来清理它们。

答案 1 :(得分:3)

我认为这并不是git-subtree的特定内容,如果你在两个分支之间切换,你会有同样的情况,其中一个生成一些gitignore中的额外文件而另一个不知道他们...我会说git的这种行为是相当正确的,因为如果我向gitignore添加一个文件,我希望它会完全忽略它并且不会对它做任何事情 - 包括在移动时也不会删除它到一个没有经过监督的分支......

您可以采取的方法是:

  • 也将相同的文件添加到子目录/子项目中的gitignore
  • 在切换分支之前执行git clean
  • 只是忽略这一点,毕竟,你可能不会在git子树分割生成的分支中做很多工作,而不是将提交推到外面...如果你想分别在子项目上工作,那么也许只需在主要项目之外的另一个目录中签出子项目本身。

答案 2 :(得分:0)

您的.gitignore文件错误地将gitignore语法与gitattributes语法混合在一起。

.gitignore文件应该只有模式。像

这样的东西
*.py diff=python
*.eps binary

属于.gitattributes文件。