将多个项目放在一个git仓库中的最佳做法是什么?
由于某些原因,我只有一个存储库可供使用。 但我有多个项目,包括Java项目,PHP脚本和Android应用程序。 现在我的问题是,我必须把它们放到每个项目的不同的子文件夹中; 并为PHP项目和Java项目,我使用不同的IDE。 你知道,每个IDE都可以有一个工作空间。
谁能告诉我一个解决问题的最佳实践?
虽然大多数人会告诉你只是使用多个存储库,但我觉得值得一提的是还有其他解决scheme。
解决scheme1
一个存储库可以包含多个独立的分支,称为孤立分支 。 孤儿的分支是完全独立的; 他们不分享历史。
git checkout --orphan BRANCHNAME
这会创build一个新的分支,与您当前的分支无关。 每个项目应该在自己的孤儿分支。
现在不pipe出于什么原因,git需要在孤儿签出之后进行一些清理工作。
rm .git/index rm -r *
确保在删除之前一切都已经完成
一旦孤立分支是干净的,你可以正常使用它。
解决scheme2
避免孤儿分支的一切麻烦。 创build两个独立的存储库,并将它们推送到同一个远程。 只需使用不同的分行名称为每个回购。
# repo 1 git push origin master:master-1 # repo 2 git push origin master:master-2
解决scheme3
这是为多个项目使用单个目录。 我将这种技术用于一些密切相关的项目,我经常需要将更改从一个项目拖到另一个项目。 这和孤儿的想法很相似,但是分支不需要孤儿。 只需从相同的空目录状态启动所有项目。
从一个提交的空目录启动所有项目
不要指望从这个解决scheme奇迹。 正如我所看到的,你总是会对未跟踪的文件感到烦恼。 Git并不知道如何处理它们,所以如果有一个由编译器生成的中间文件,并被.gitignore文件忽略,那么如果你尝试快速的交换,他们可能会暂停一些时间例如 – 你的软件项目和一个博士论文项目。
不过,这是计划。 开始你应该开始任何git项目,通过提交空的存储库,然后从相同的空目录状态启动所有的项目。 这样你就可以确定这两个文件是相当独立的。 另外,给你的分行一个适当的名字,不要懒惰地使用“主”。 你的项目需要分开,给他们适当的名字。
Git的提交(因此标签和分支)基本上存储的目录和其子目录的状态, Git不知道这些是否是相同或不同的项目的一部分,所以真正没有问题的git存储不同的项目在同一个存储库。 那么问题就出在你使用另一个项目清理未跟踪的文件,或者稍后分离项目。
创build一个空的存储库
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
这不是一个不可逾越的问题
按照定义sorting,git并不真正知道如何处理未跟踪的文件,这取决于你处理它们。 您可以停止未跟踪的文件从一个分支到另一个分支,如下所示。
git checkout EMPTY ls untracked_software_file.prog rm -r * (direcory 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
如果在提交空存储库时指定了date,则提交可以具有相同的SHA1代码。 这样可以独立创build两个存储库,然后将它们合并到一个具有共同根目录的树中。
例
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
结果
每个项目使用子目录?
如果你把你的项目放在子目录中,也可能有帮助,比如说有文件
chess.prog philosophy_doctorate.txt
有
chess/chess.prog thesis/philosophy_doctorate.txt
在这种情况下,您未跟踪的软件文件将是chess/untracked_software_file.prog
。 在thesis
目录中工作时,不应该被未跟踪的国际象棋程序文件打扰,并且您可能会发现在不删除未跟踪其他项目的文件的情况下可以愉快地工作的情况。
另外,如果要从其他项目中删除未跟踪的文件,则转储不需要的目录比通过select每个项目来删除不需要的文件要快(不太容易出错)。
我会用git submodules
。
看看Git仓库在git仓库