有没有办法把多个项目放在一个git存储库?

由于某种原因,我只有一个库可以使用。< br / > 但是我有多个项目<强> < /强>,包括java项目,PHP scriptsAndroid应用程序项目 现在我的问题是,我必须把它们放在储存库
内的不同子文件夹中 我使用不同的IDE,你知道,每个IDE都可以有自己的工作空间

有没有一种简单的方法(比如,通过设计而不是意见)来解决这个问题?

281318 次浏览

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

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

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

我将使用git submodules

看看这里Git存储库中的Git存储库

根据2019年2月,我建议Monorepos

  • Lerna
  • < a href = " https://docs.bitsrc。io / noreferrer“rel = >位< / >