java
PHP scripts
Android
有没有一种简单的方法(比如,通过设计而不是意见)来解决这个问题?
虽然大多数人会告诉您只需使用多个存储库,但我认为还有其他解决方案值得一提。
一个存储库可以包含多个独立的分支,称为孤儿分支。孤枝是彼此完全分离的;他们没有共同的历史。
git checkout --orphan BRANCHNAME
这将创建一个与当前分支无关的新分支。每个项目都应该在它自己孤立的分支中。
现在,不管出于什么原因,git在孤儿签出后需要进行一些清理。
rm .git/index rm -r *
在删除之前确保所有内容都已提交
一旦孤儿分支被清除,您就可以正常使用它。
避免孤儿分支的所有麻烦。创建两个独立的存储库,并将它们推送到同一个远程服务器。只需为每个回购使用不同的分支名称。
# repo 1 git push origin master:master-1 # repo 2 git push origin master:master-2
这是为了将一个目录用于多个项目。我在一些密切相关的项目中使用这种技术,在这些项目中,我经常需要将一个项目的更改拉到另一个项目中。这类似于孤立分支的想法但分支不需要被孤立。只需从相同的空目录状态启动所有项目。
不要指望这个解决方案能带来奇迹。在我看来,您总是会对未跟踪的文件感到烦恼。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目录下工作时,你不应该被未跟踪的象棋程序文件打扰,你可能会发现你可以愉快地工作,而不需要从其他项目中删除未跟踪的文件。
chess/untracked_software_file.prog
thesis
此外,如果您想从其他项目中删除未跟踪的文件,转储不需要的目录比通过选择每个目录来删除不需要的文件要更快(而且更不容易出错)。
所以你可能想给分支起个这样的名字
project1/master project1/featureABC project2/master project2/featureXYZ
我将使用git submodules。
git submodules
看看这里Git存储库中的Git存储库
根据2019年2月,我建议Monorepos
Monorepos