8

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

根据我的理解 git subtree 可以做到这一点。

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 目录以及其中以波浪号或 ./data 目录结尾的所有文件。

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
*~

我该如何防止这种情况?

4

3 回答 3

5

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

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

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

于 2010-03-24T01:58:05.190 回答
4

我认为这并不是 git-subtree 所特有的,如果您在两个分支之间切换并且其中一个在 gitignore 中生成了一些额外的文件,而另一个不知道它们,那么您会遇到相同的情况。 . 我会说 git 的这种行为是相当正确的,因为如果我向 gitignore 添加一个文件,我希望它会完全忽略它并且不会对它做任何事情——包括当你移动到一个分支时不删除它它没有被忽略的地方......

您可以处理的可能方法是:

  • 将相同的文件也添加到子目录/子项目中的 gitignore
  • 在切换分支之前执行 git clean
  • 忽略这一点,毕竟,除了将提交推送到外部之外,您可能不会在 git subtree split 生成的分支中做太多工作......如果您确实想单独处理子项目,那么也许只需签出子项目本身位于主目录之外的另一个目录中。
于 2010-05-08T18:42:05.037 回答
1

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

.gitignore文件应该只有模式。像这样的东西

*.py diff=python
*.eps binary

.gitattributes而是属于文件。

于 2014-03-27T19:59:22.253 回答