将多个项目放在git存储库中的最佳实践是什么?

时间:2013-02-04 02:22:52

标签: git

由于某种原因,我只使用一个存储库 但我有 多个项目 ,包括java个项目,php scriptsAndroid个应用项目。

现在我的问题是,我必须将它们放在存储库中的不同子文件夹中 我使用不同的IDE,您知道,每个IDE都可以拥有自己的工作空间。

谁能告诉我解决问题的最佳做法?

3 个答案:

答案 0 :(得分:167)

虽然大多数人会告诉您只使用多个存储库,但我觉得值得一提的是还有其他解决方案。

解决方案1 ​​

单个存储库可以包含多个独立分支,称为孤立分支。孤儿分支彼此完全分开;他们不分享历史。

git checkout --orphan BRANCHNAME

这将创建一个与当前分支无关的新分支。每个项目都应该在自己的孤立分支中。

现在无论出于何种原因,git在孤儿结账后需要进行一些清理。

rm .git/index
rm -r *

确保所有内容都已提交,然后再删除

孤儿分支干净后,您可以正常使用它。

解决方案2

避免所有孤儿分支的麻烦。创建两个独立的存储库,并将它们推送到同一个远程存储库。只需为每个仓库使用不同的分支名称。

# repo 1
git push origin master:master-1

# repo 2
git push origin master:master-2

答案 1 :(得分:10)

解决方案3

这是为多个项目使用单个目录。我将这种技术用于一些密切相关的项目,我经常需要将更改从一个项目转移到另一个项目。它类似于孤儿分支的想法,但分支机构不需要成为孤儿。只需从相同的空目录状态启动所有项目。

从一个已提交的空目录

启动所有项目

不要期待这个解决方案的奇迹。在我看来,你总是会对未跟踪的文件感到烦恼。 Git并不真正知道如何处理它们,因此如果编译器生成的中间文件被.gitignore文件忽略,那么如果你尝试它们,它们很可能会被搁置一些时间快速交换 - 例如 - 您的软件项目和PH.D论文项目。

然而,这是计划。从你应该启动任何git项目开始,提交空的存储库,然后从相同的空目录状态启动所有项目。这样你就可以确定这两个文件是相当独立的。另外,给你的分支机构一个正确的名称,不要懒得使用" master"。您的项目需要分开,因此请给它们适当的名称。

Git提交(以及标签和分支)基本上存储目录及其子目录的状态, Git不知道这些是相同或不同项目的一部分所以真的没有问题用于在同一存储库中存储不同项目的git。那么问题就是你在使用另一个项目时从一个项目中清除未跟踪的文件,或者稍后将项目分开。

创建一个空存储库

cd some_empty_directory
git init
touch .gitignore
git add .gitignore
git commit -m empty
git tag EMPTY

从空开始你的项目。

在一个项目上工作。

git branch software EMPTY
git checkout software
echo "array board[8,8] of piece" > chess.prog

git add chess.prog 
git commit -m "chess program"

启动另一个项目

随时随地。

git branch thesis EMPTY
git checkout thesis
echo "the meaning of meaning" > philosophy_doctorate.txt
git add philosophy_doctorate.txt 
git commit -m "Ph.D"

来回切换

随时随地在项目之间前进和后退。 这个例子可以追溯到国际象棋软件项目。

git checkout software
echo "while not end_of_game do make_move()" >> chess.prog
git add chess.prog 
git commit -m "improved chess program"

未经跟踪的文件很烦人

然而,在项目/分支之间交换时,您会被未跟踪的文件所困扰。

touch untracked_software_file.prog
git checkout thesis 
ls
    philosophy_doctorate.txt  untracked_software_file.prog

这不是一个不可逾越的问题

根据定义排序,git并不真正知道如何处理未跟踪的文件,并且由您来处理它们。您可以阻止未跟踪的文件从一个分支传送到另一个分支,如下所示。

git checkout EMPTY 
ls
    untracked_software_file.prog
rm -r *
    (directory is now really empty, apart from the repository stuff!)
git checkout thesis
ls
    philosophy_doctorate.txt

在检查我们的新项目之前确保目录为空,我们确保没有来自其他项目的未跟踪文件。

一项改进

$ GIT_AUTHOR_DATE='2001-01-01:T01:01:01' GIT_COMMITTER_DATE='2001-01-01T01:01:01' git commit -m empty

如果在提交空存储库时指定了日期,则提交可以具有相同的SHA1代码。这允许独立创建两个存储库,然后将它们合并到一个树中,稍后在一个存储库中具有公共根。

实施例

mkdir single_repo_for_thesis_and_chess
cd single_repo_for_thesis_and_chess
git init
touch .gitignore
git add .gitignore
GIT_AUTHOR_DATE='2001-01-01:T01:01:01' GIT_COMMITTER_DATE='2001-01-01:T01:01:01' git commit -m empty
git tag EMPTY
echo "the meaning of meaning" > thesis.txt
git add thesis.txt
git commit -m "Wrote my PH.D"
git branch -m master thesis
git remote add chess ../chessrepository/.git
git fetch chess chess:chess

结果

Diagram of merged repositories

每个项目使用子目录?

如果您将项目保留在子目录中,也可能会有所帮助,例如:而不是有文件

chess.prog
philosophy_doctorate.txt 

chess/chess.prog
thesis/philosophy_doctorate.txt 

在这种情况下,您未跟踪的软件文件将为chess/untracked_software_file.prog。在thesis目录中工作时,您不应该被未跟踪的国际象棋程序文件打扰,并且您可能会遇到可以愉快地工作而不从其他项目中删除未跟踪文件的情况。

此外,如果要从其他项目中删除未跟踪的文件,转储不需要的目录比通过选择每个文件删除不需要的文件更快(并且更不容易出错)。

答案 2 :(得分:4)

我会使用git submodules

看看Git repository in a Git repository

截至2014年2月,我建议Monorepos