238

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

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

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

4

3 回答 3

236

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

解决方案 1

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

git checkout --orphan BRANCHNAME

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

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

rm .git/index
rm -r *

在删除之前确保所有内容都已提交

孤立分支清理干净后,就可以正常使用了。

解决方案 2

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

# repo 1
git push origin master:master-1

# repo 2
git push origin master:master-2
于 2013-02-04T04:22:01.907 回答
22

解决方案 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 代码。这允许独立创建两个存储库,然后将它们合并到一个树中,稍后在一个存储库中具有一个共同的根。

例子

# 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
于 2017-08-04T10:45:27.503 回答
17

我会用git submodules.

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

根据 2019 年 2 月,我建议Monorepos

于 2017-08-04T10:50:26.737 回答