我正在测试使用git-subtree将库repo合并到一个更大的项目中.原则上似乎很棒.有时当我做一个"git subree pull"时,我会遇到这样的合并冲突:
<<<<<<< HEAD
=======
An inserted line from the lib repo
>>>>>>> 4d348903449ebb584ab224cb34c6038fbf6b352d
Run Code Online (Sandbox Code Playgroud)
这是在库仓库中进行的更改,合并到一个尚未在本地修改的文件中.或者另一个例子,我在本地项目仓库中添加了一行,但是在一个文件中,该文件是要合并的子树的一部分:
<<<<<<< HEAD
Another inserted line
=======
>>>>>>> 4d348903449ebb584ab224cb34c6038fbf6b352d
Run Code Online (Sandbox Code Playgroud)
为什么git会将这些报告为合并冲突,但该地区报告称冲突是空的?有什么方法可以预防吗?
这些很容易解决,但它搞砸了git子树的工作流程
我正在尝试使用我的项目添加一个repo(称为cow)git subtree add.特别是,我想添加分支stable(不是master分支).我试过了:
git subtree add -P cow https://github.com/geoffryan/cow.git stable
Run Code Online (Sandbox Code Playgroud)
但是这返回了错误
'stable' does not refer to a commit.
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
git subtree add -P cow https://github.com/geoffryan/cow.git cow/stable
'cow/stable' does not refer to a commit.
Run Code Online (Sandbox Code Playgroud)
和:
git subtree add -P cow https://github.com/geoffryan/cow.git ca26d248a12c21264e32a2c212381cafb578c9fb
'ca26d248a12c21264e32a2c212381cafb578c9fb' does not refer to a commit.
Run Code Online (Sandbox Code Playgroud)
哈希是stable分支中最新提交的哈希值.我在网上看到的使用示例都master用于提交,是否可以subtree add在非主分支上使用?
我正在努力从SVN迁移到Git.我已经习惯git-svn将历史记录放到一个git存储库中,我已经知道如何使用git-subtree将该存储库拆分为较小的存储库.这个问题不是关于如何进行迁移,而是关于何时拆分以及何时不进行拆分.
我想拆分大型存储库,因为某些目录是自包含的库,也与其他项目共享.以前svn checkout是在库上完成的,无需签出整个项目.在所有这些过程中,我发现可能有数十个目录在自己的存储库中是有意义的,因为它们是1)独立的,2)跨项目共享.
一旦你获得了一些git存储库,使用一个工具可以更容易地处理许多存储库似乎是明智的.一些例子是谷歌的repo,git submodules,git subtree,并创建自定义脚本(看来铬做到这一点).我已经探索了这些不同的方法,并了解如何使用它们.
所以问题是关于从颠覆过渡的方向.
我是否应该尝试坚持使用一个大型git存储库,只在绝对必要时才将其拆分成更小的部分,还是应该将其拆分为数十个或可能数百个较小的存储库? 哪个更容易使用?还有其他我错过的解决方案吗?如果使用多个存储库,我应该使用哪个工具?哪些因素会让某人偏爱另一种方法呢?
注意:需要在Windows,MacOS和Linux上签出源代码.
所以我使用git-subtree在repoA的子目录中拥有repoB的各种分支,就像这样
git clone repoA
cd repoA
// some commits to repoA here
git subtree add --prefix=src/dirA repoB branchA
Run Code Online (Sandbox Code Playgroud)
我在repoA中使用了一些提交
git subtree push --prefix=src/dirA repoB branchA
Run Code Online (Sandbox Code Playgroud)
一段时间后,我从另一个repoC中提交了一些repoB/branchA,其中branchA也是使用git-subtree添加的.
现在,我试试
git subtree pull --prefix=src/dirA repoB branchA
Run Code Online (Sandbox Code Playgroud)
但是,我没有明显的理由得到合并冲突.这些变化很简单,根本没有冲突 - 正如补丁所证实的那样.
我不确定如何解决这个错误.我已经找到了另外四个处理相同/类似问题的线程:
我不确定这与不同的SHA-1有关,因为我没有重新提交我的提交,也没有编辑它们; 链接1到3.
我的问题更像是链接4,其中git奇怪地无法进行简单的合并.但是,链接3讨论了子树合并策略,特别是git-subtree,所以我不确定这在我的情况下是否适用.
虽然情况看起来是一样的:
<<<<<<< HEAD
=======
// changes from commit I try to pull from repoB/branchA
>>>>>>> {commit SHA-1 from commit I try to pull from repoB/branchA}
Run Code Online (Sandbox Code Playgroud)
所以我注意到BASE在三向合并窗口(kdiff3)中显然是错误的.但是,如果是这种情况,为什么git尝试不应用所有早期的提交?发行
git log --oneline …Run Code Online (Sandbox Code Playgroud) 许多月前我在我的git存储库中添加了一个子树.该子树包含多个文件夹和文件.我添加了子树而不是创建子模块(如推荐的那样).现在我意识到我只想要子树中的一个文件,而不是其他文件.更糟糕的是,当其他人成为clone我的存储库时,他们得到的并不是预期的 - 与子树和我创建的其他代码存在一些冲突.
我可以随身携带文件/文件夹
git rm subtree–folder1 subtree_folder2 subtree_files.*
Run Code Online (Sandbox Code Playgroud)
但是,我仍然从子树中留下了冗长的提交历史.
自从我最初添加子树以来,我已经完成了相当多的开发,并且不会丢失我生成的提交历史记录.
总之,这就是我想要的:
这可能吗?
PS.一个可能的复杂因素是我将我希望保留的单个头文件从子树移到我代码中的某个文件夹.我希望这不是让我忘记子树历史的原因.
从远程服务器重新结账后,我有以下内容:
$ ls
.git CMakeLists.txt Read.cpp logging.conf
.gitignore ENDF6 TestData src
.sparse-checkout LICENCE doc test
.travis.yml README.md include tools
Run Code Online (Sandbox Code Playgroud)
哪里.gitignore只有:build/debug /
当我按照建议尝试命令时,我没有得到非常满意的回复:
$ git filter-branch --index-filter 'git rm --cached -rf test tools src doc LICENCE README.md .travis.yml' HEAD
Rewrite 2fec85e41e40ae18efd1b130f55b14166a422c7f (1/1701)fatal: pathspec 'test' did not match any files
index filter failed: git rm --cached -rf test …Run Code Online (Sandbox Code Playgroud) 如何将git子模块(本地文件系统中的文件夹作为远程)转换为git子树,最好保留子模块的提交历史记录?
我们有一个基于git-flow的存储库,我们在开发分支上添加了一个外部库作为子树(使用Atlassian SourceTree的git子树).
Project/
Library/
X/
Y/
Z/
Run Code Online (Sandbox Code Playgroud)
后来我们做了一个git flow release,将开发中的变化合并为主(发布).
问题是当检出master时,Library的内容放在存储库的根目录而不是在Library中,就像它git subtree在合并期间丢失了前缀一样.
Project/
X/
Y/
Z/
Run Code Online (Sandbox Code Playgroud)
知道出了什么问题吗?
我使用git子树添加而不使用squash选项将树合并到我的存储库中.git日志显示提交已成功添加到存储库.但是,如果我这样做git log --follow filename,则历史记录在合并时停止,并且不会显示先前的提交.我尝试使用-M而不是,--follow这也不起作用.如何在合并之前获取特定文件或文件的提交日志?
我刚刚发现git-subtree工具,前段时间成为主要git repo的一部分 https://github.com/apenwarr/git-subtree/
但是我不完全理解这个工具提供了什么功能,而不是现有的"git read-tree"+"git merge -s subtree".是git子树的唯一选择 - 使得结果提交历史看起来更好还是它具有我忽略的更多功能?
我有两个git存储库显示如下.第一个结构就像一个典型的python项目.
foo_repo/
.git/
setup.py
foo/
__init__.py
some_code.py
tests/
bar/
.git/
Run Code Online (Sandbox Code Playgroud)
我想将foo_repo/foo/目录bar/作为子树包含在内,我希望能够将更新foo_repo/foo/some_code.py从foo_repo存储库合并到bar,反之亦然.
初始设置不是太糟糕.从foo/我使用的目录:
git subtree --prefix=foo/ split -b export
Run Code Online (Sandbox Code Playgroud)
然后我在foo_repo中有一个新的分支,只有foo_repo/foo/目录的内容.为了把它带到酒吧,我只是去bar/目录和:
git subtree --prefix=foo/ add ../foo_repo/.git export
Run Code Online (Sandbox Code Playgroud)
既然我已经完成了设置,我想做一些代码开发并foo/在两个repos中保持最新.从酒吧推出我想我已经想通了.来自bar/目录:
touch foo/more_code.py
git add foo/more_code.py
git commit -m "more code"
git subtree --prefix=foo/ push ../foo_repo/.git export
Run Code Online (Sandbox Code Playgroud)
然后从foo_repo/目录:
git checkout master
git subtree --prefix=foo/ merge export
Run Code Online (Sandbox Code Playgroud)
合并另一种方式是我被困住的地方.来自foo_repo/:
git checkout master
touch foo/yet_more_code.py
git add foo/yet_more_code.py …Run Code Online (Sandbox Code Playgroud)