相关疑难解决方法(0)

将(移动)子目录分离到单独的Git存储库中

我有一个Git存储库,其中包含许多子目录.现在我发现其中一个子目录与另一个子目录无关,应该分离到一个单独的存储库.

如何在将文件的历史记录保存在子目录中的同时执行此操作?

我想我可以制作一个克隆并删除每个克隆的不需要的部分,但我想这会给我一个完整的树,当检查旧版本等.这可能是可以接受的,但我宁愿能够假装两个存储库没有共享历史记录.

为了说清楚,我有以下结构:

XYZ/
    .git/
    XY1/
    ABC/
    XY2/
Run Code Online (Sandbox Code Playgroud)

但我想这样做:

XYZ/
    .git/
    XY1/
    XY2/
ABC/
    .git/
    ABC/
Run Code Online (Sandbox Code Playgroud)

git git-filter-branch git-subtree

1712
推荐指数
15
解决办法
25万
查看次数

是否可以在Git中移动/重命名文件并保留其历史记录?

我想在Git中重命名/移动项目子树

/project/xyz
Run Code Online (Sandbox Code Playgroud)

/components/xyz
Run Code Online (Sandbox Code Playgroud)

如果我使用普通的git mv project components,那么所有的提交历史xyz project都会丢失.有没有办法移动这个以保持历史?

git rename mv

630
推荐指数
11
解决办法
32万
查看次数

将Git存储库内容移动到保留历史记录的另一个存储库

我试图使用以下命令仅将一个存储库(比如repo1)的内容移动到另一个现有存储库(比如repo2);

  1. git clone repo1
  2. git clone repo2
  3. cd repo1
  4. git remote rm origin
  5. git remote add repo1
  6. git push

但它不起作用.我回顾了其他类似的帖子,但我只发现移动文件夹而不是内容.

git merge migrate repository

118
推荐指数
8
解决办法
7万
查看次数

回顾性地将git文件夹转换为子模块?

通常情况下,您正在编写某种类型的项目,过了一段时间后,很明显项目的某些组件实际上可用作独立组件(可能是库).如果您从早期开始就有这个想法,那么大部分代码都存在于自己的文件夹中.

有没有办法将git项目的子目录之一转换为子模块?理想情况下会发生这样的情况,即该目录中的所有代码都从父项目中删除,并且子模块项目被添加到其中,具有所有适当的历史记录,并且所有父项目提交都指向正确的子模块提交.

git git-submodules

103
推荐指数
5
解决办法
2万
查看次数

如何在保留历史记录的同时将文件从一个git存储库移动到另一个存储库

我试图将一个文件(称为foo.txt)从一个存储库移动到另一个(不相关的)存储库,保留其历史记录.ebneter的问题显示了如何为子目录执行此操作.taw的问题有一些提示和建议,但不是一步一步的程序.jkeating的问题看起来很有希望,但对我没有用.针对此特定用例,谷歌搜索空洞.我正在寻找的是一系列明确的命令来实现这一目标.

我开始遵循的命令序列是:

$ git clone source-repo/ source-repo-copy
$ cd source-repo-copy
$ git filter-branch --tree-filter 'test ! "$@" = "foo.txt" && \
  git rm --cached --ignore-unmatch $@ || true' --prune-empty
Run Code Online (Sandbox Code Playgroud)

我的filter命令的逻辑是git rm所有不是foo.txt的文件.我添加了|| true命令以强制它具有零返回值以满足filter-branch.

我的目的是将source-repo-copy设置为我的目标存储库(target-repo)的远程,并假设git filter-branch过滤掉除foo.txt以外的所有内容,将source-repo-copy合并到target-repo中.不幸的是,这个git filter-branch命令似乎没有效果.它运行时没有任何错误,似乎在源代码库中通过600多次提交进行了研究,但是当它完成时,git log源代码复制中的和文件看起来是一样的.不应该丢失除foo.txt之外的所有文件,并且所有未触及它的提交都会从日志中删除吗?

此时我不知道该怎么办.有什么建议?

git git-filter-branch

44
推荐指数
1
解决办法
2万
查看次数

Git Subtree只有一个文件或目录

我使用Git Subtree如下:

git subtree add --prefix=directory_destination_path --squash git@bitbucket.org:kicaj/projectname.git master
Run Code Online (Sandbox Code Playgroud)

但在路径:directory_destination_path复制所有回购projectname.git

如何复制到directory_destination_path只有子目录或只有一些文件projectname.git

编辑:还有
一个问题:
如何更新(自动)两个存储库中的文件更改仍然是相同的?有可能的?

git bitbucket git-subtree

24
推荐指数
3
解决办法
7599
查看次数

GIT Split Repository目录保留*move/renames*history

假设您拥有存储库:

myCode/megaProject/moduleA
myCode/megaProject/moduleB
Run Code Online (Sandbox Code Playgroud)

随着时间的推移(月),您重新组织项目.重构代码以使模块独立.megaProject目录中的文件将移动到它们自己的目录中.强调移动 - 保留这些文件的历史.

myCode/megaProject
myCode/moduleA
myCode/moduleB
Run Code Online (Sandbox Code Playgroud)

现在您希望将这些模块移动到他们自己的GIT仓库中.只留下megaProject的原件.

myCode/megaProject
newRepoA/moduleA
newRepoB/moduleB
Run Code Online (Sandbox Code Playgroud)

记录该filter-branch命令是为了执行此操作,但是当文件移出目标目录之外时,它不会跟踪历史记录.因此,历史记录从文件移动到新目录开始,而不是文件的历史,然后它们存在于旧的megaProject目录中.

如何基于目标目录拆分GIT历史记录,并遵循此路径之外的历史记录 - 只保留与这些文件相关的提交历史记录而不是其他内容?

关于SO的众多其他答案主要集中在拆分回购 - 但没有提及拆分和跟随移动历史.

git

11
推荐指数
2
解决办法
983
查看次数

如何在两个不同的git存储库(而不是克隆)中同步文件并保留历史记录?

我维护两个不同的git repos,需要共享一些文件,我希望一个repo中的提交显示在另一个repo中.在每个回购中进行持续维护的好方法是什么?

我一直是perlfaq(Github)的维护者之一,最近我担任维护Perl核心文档的角色,这也是git.

早在我开始维护perlfaq之前,它就住在一个单独的源代码控制库中.我最近将其转换为git.perl5-porters中的一个会定期同步perlfaq repo和perl repo中的共享文件.既然我们已经切换到git,我们就会有点懒惰转换工具,现在我就是这样做的人.目前,两个回购将保持分开.

目前,为了同步perl的新(每月)版本的FAQ,我几乎惭愧地说我只是复制perlfaq repo中的perlfaq*.pod文件并将它们覆盖在perl repo中.这会丢失历史等.另外,有时有人会对perl repo中的那些文件进行更改,最后我会覆盖它(是的,请检查git diff你这个白痴!).这些文件在repo中没有相同的路径,但我认为这是我可以改变的.

我想做的事情,在彩虹和小马的神奇世界中,是从perlfaq仓库中取出物品并将它们应用于perl仓库,反之亦然,因此历史和提交ID各自对应.

  • 创建补丁是有效的,但管理它也需要做很多工作
  • Git子模块似乎只能用于拉入整个外部仓库
  • 我还没有找到类似svn文件外部的东西,但无论如何这都适用于两个方向
  • 我喜欢从一个人那里取物品,然后在另一个人身上挑选它们

管理这个的好方法是什么?

git

10
推荐指数
1
解决办法
2227
查看次数

为什么git log with --follow和--reverse只返回最后一次提交?

我想从反向运行开始查看文件的所有提交

git log --reverse [file]
Run Code Online (Sandbox Code Playgroud)

它按预期工作.但对于重命名的文件,它只显示在重命名的提交中,所以我在其中添加了--follow.

git log --reverse --follow [file]
Run Code Online (Sandbox Code Playgroud)

但它现在只显示为该文件完成的最后一次提交.

如何将两者结合起来以获得所需的结果.

git

10
推荐指数
1
解决办法
521
查看次数

Git:将文件的历史记录从一个存储库复制到另一个存储库

我有两个git存储库说A和B,都包含一个名为file1.cc的文件.是否可以将repo A中file1.cc的历史合并/复制到repo B中的file1.cc?

问题是我们已经将文件从repo A移动到repo B,并且所有文件的历史记录都丢失了.但现在一些开发人员已经开始研究回购B并推动了他们的改变.所以现在我想要从repo A到repo B的一些文件的合并/复制历史记录,这些文件仅适用于某些文件.有可能这样做吗?或者一旦丢失的文件的历史永远丢失?

请帮忙.提前致谢.

git

7
推荐指数
1
解决办法
1万
查看次数