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

Sto*_*ony 161 git

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

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

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

Jac*_*ter 182

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

解决方案1

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

git checkout --orphan BRANCHNAME
Run Code Online (Sandbox Code Playgroud)

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

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

rm .git/index
rm -r *
Run Code Online (Sandbox Code Playgroud)

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

一旦孤儿分支干净,您就可以正常使用它.

解决方案2

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

# repo 1
git push origin master:master-1

# repo 2
git push origin master:master-2
Run Code Online (Sandbox Code Playgroud)

  • @Nate他说的是:制作两个独立的_local_存储库,然后将它们都推送到GitHub上的同一个_remote_存储库. (10认同)
  • 解决方案2需要更多解释 (10认同)
  • 我不确定我是否理解解决方案2.您是说您将所有.git文件提交到主git仓库?使用多个孤立分支与使用多个分支之间有什么不同? (5认同)
  • 非常感谢,应该可以解决我的问题。实际上,这两种解决方案使用分支来容纳不同的项目。 (3认同)
  • 谢谢@TheGuywithTheElfHat。现在我再看一遍(9 个月后),对我来说似乎很清楚。解决方案 2 仍在创建孤立的分支,但我可以看到这种方法如何更容易处理。 (2认同)

Iva*_*van 14

解决方案3

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

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

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

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

Git提交(因此标签和分支)基本上存储目录及其子目录的状态,Git不知道这些是相同或不同项目的一部分,所以git在同一个存储库中存储不同项目的确没有问题.然后问题在于,当您使用另一个项目时,从一个项目中清除未跟踪的文件,或者稍后分离项目.

创建一个空的存储库

cd some_empty_directory
git init
touch .gitignore
git add .gitignore
git commit -m empty
git tag EMPTY
Run Code Online (Sandbox Code Playgroud)

从空开始你的项目.

在一个项目上工作.

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"
Run Code Online (Sandbox Code Playgroud)

开始另一个项目

随时随地.

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"
Run Code Online (Sandbox Code Playgroud)

来回切换

您可以随时在项目之间前后转发.这个例子可以追溯到国际象棋软件项目.

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

未跟踪的文件很烦人

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

touch untracked_software_file.prog
git checkout thesis 
ls
    philosophy_doctorate.txt  untracked_software_file.prog
Run Code Online (Sandbox Code Playgroud)

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

按照定义排序,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
Run Code Online (Sandbox Code Playgroud)

通过在签出新项目之前确保目录为空,我们确保没有来自另一个项目的未跟踪文件.

一个改进

$ GIT_AUTHOR_DATE='2001-01-01:T01:01:01' GIT_COMMITTER_DATE='2001-01-01T01:01:01' git commit -m empty
Run Code Online (Sandbox Code Playgroud)

如果在提交空存储库时指定了日期,则提交可以具有相同的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
Run Code Online (Sandbox Code Playgroud)

结果

合并存储库的图表

每个项目使用子目录?

如果您在可能的情况下将项目保留在子目录中,例如,而不是使用文件,这也可能有所帮助

chess.prog
philosophy_doctorate.txt 
Run Code Online (Sandbox Code Playgroud)

chess/chess.prog
thesis/philosophy_doctorate.txt 
Run Code Online (Sandbox Code Playgroud)

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

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


Hit*_*nds 7

我会用git submodules

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

根据2019年2月,我建议 Monorepos

  • 您能解释一下为什么是“Monorepos”吗? (5认同)
  • 恕我直言,提及*Monorepos*而不告诉您为什么推荐它不适合作为答案。 (5认同)
  • “我只有一​​个存储库可以使用。” 您是否愿意解释如何将几个子模块存储在同一存储库中? (4认同)
  • git submodule add [URL到git repo]-https://git-scm.com/book/en/v2/Git-Tools-Submodules (4认同)