将多个项目放入git存储库的最佳实践是什么?[关闭]


188

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

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

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



2
你不是一个人。我的回购协议也有类似的情况,我将其用于学习目的(例如:github.com/hopbit/java-sandbox)。我不希望创建新的回购协议,试图为每本新书的例子/教程中,我开始读...
卢卡斯Siwiński

想要这样做的原因之一是,如果您有一个项目是产品代码,并且已将其部署到测试或生产等运行时环境中。第二个项目是对第一个项目进行系统测试(例如BDD)的应用程序。这两个项目之间有着密切的关系,现在您可以使用一个存储库URL维护/引用整个项目。
Lance Kind

如下摘要“ Git不知道这些是相同还是不同项目的一部分”
ahmednabil88 '19

Answers:


198

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

解决方案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

非常感谢,那应该可以解决我的问题。实际上,这两个解决方案使用分支来容纳不同的项目。
斯托尼,2013年

6
我不确定我是否理解解决方案2。您是说要将所有.git文件提交到主git存储库中吗?使用多个孤立分支与使用多个分支有什么区别?
Nate

13
@Nate他的意思是:创建两个单独的本地存储库,然后将它们都推送到GitHub上的同一远程存储库中。
戴帽子的家伙

1
谢谢@TheGuywithTheElfHat。现在,我又看了一次(9个月后),对我来说似乎很清楚。解决方案2仍在创建孤立分支,但我可以看到这种方法更易于处理。
Nate 2014年

21
方案二需要更多的解释
eC的Droid的

19

解决方案3

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

从一个已提交的空目录启动所有项目

不要期望这种解决方案会带来奇迹。如我所见,您始终会对未跟踪的文件感到烦恼。Git确实不知道如何处理它们,因此,如果编译器生成了中间文件,而您的.gitignore文件忽略了该中间文件,那么如果您尝试快速交换它们,它们有时可能会挂起。例如在您的软件项目和博士学位论文之间。

但是,这是计划。通过提交空存储库来开始任何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代码。这样就可以独立创建两个存储库,然后将它们合并到一个树中,并在一个存储库中具有公共根。

# Create thesis repository. 
# Merge existing chess repository branch into it

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

# It's as simple as this ...
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目录中工作时,不要被未跟踪的国际象棋程序文件打扰,并且您可能会发现可以愉快地工作而不会从其他项目中删除未跟踪的文件的情况。

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

分支名称可以包含“ /”字符

因此,您可能想为分支命名,例如

project1/master
project1/featureABC
project2/master
project2/featureXYZ

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.