相关疑难解决方法(0)

将文件夹移动到子模块中,现在获得"未被跟踪的文件将被覆盖"消息

我在一个大型回购团队工作.最近我们决定将其中一个文件夹移动到自己的子模块中

-- aaa
     -- .git
     --  bbb
     --  ccc
     --  www      # this folder is going into its own repo.
Run Code Online (Sandbox Code Playgroud)

我按照说明将www文件夹过滤到这里列出的自己的repo:Detach(move)子目录到单独的Git存储库中.我把www文件夹移出了aaa回购.

我通过运行以下命令从主分支中删除了该目录:

 $ cd aaa
 $ git checkout master
 $ git rm -rf www
 $ git commit -m "remove the www/ folder from the aaa repo."
Run Code Online (Sandbox Code Playgroud)

所以现在在master上,树看起来像这样:

 -- aaa
     -- .git
     --  bbb
     --  ccc
Run Code Online (Sandbox Code Playgroud)

我想www通过运行添加为子模块:

$ cd aaa
$ git checkout master
$ git submodule add git@bitbucket.org:kevinburke/www.git www
Cloning …
Run Code Online (Sandbox Code Playgroud)

git git-submodules

13
推荐指数
1
解决办法
5345
查看次数

git filter-branch拒绝后git push

我将一个git repo分成3个.我使用Detach(move)子目录到单独的Git存储库中来分隔文件夹并将它们成功推送到新的git repos.在现有的 repo上,我使用了以下命令来清除移动的目录.

git filter-branch -f --index-filter "git rm -q -r -f --cached --ignore-unmatch lib/xxx/$REPO" --prune-empty HEAD
Run Code Online (Sandbox Code Playgroud)

现在当我做git st原始回购时,我得到:

# On branch 1.5.0
nothing to commit (working directory clean)
Run Code Online (Sandbox Code Playgroud)

当我尝试时git push,我得到:

 ! [rejected]        1.5.0 -> 1.5.0 (non-fast-forward)
error: failed to push some refs to 'git@github.com:/xxx/.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of …
Run Code Online (Sandbox Code Playgroud)

git git-filter-branch

12
推荐指数
1
解决办法
7407
查看次数

Git不会还原或提交它认为已修改的文件

我按照本教程将SVN存储库转换为Git .现在似乎无法提取此答案中建议的子存储库.

原谅长篇文章,但大部分文本都是格式良好的git输出.

操作系统:Windows 8命令行:MinGW Git版本:1.8.1.msysgit.1

除非您有一个干净的暂存区域且没有修改过的文件,否则提取子存储库的过程似乎不起作用.

git status告诉我,我有一个修改过的文件,即使这是一个新的SVN导入.好吧,让我们试着摆脱它.

尝试并还原文件.

user$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified: folder with space/folder/toolbar.png
#
no changes added to commit (use "git add" and/or "git commit -a")

user$ git checkout -- "folder with space/folder/toolbar.png"

user$ git status …
Run Code Online (Sandbox Code Playgroud)

windows git png mingw msysgit

12
推荐指数
1
解决办法
5299
查看次数

如何拆分git存储库?

我有一个包含几个模块的git存储库,每个模块都在自己的子文件夹中,我想将它们拆分成独立的存储库,理想情况下尽可能多地保留它们各自的历史记录.这样做有规范的方法吗?

完全重复

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

git

11
推荐指数
0
解决办法
9620
查看次数

从已有的repo子目录创建新的git repo

我想从已经存在的repo的子文件夹创建一个单独的repo.

将(移动)子目录分离到单独的Git存储库中就可以显示出来.但是,我无法用它获得一个干净的回购.我最终遇到了新回购的两个问题:

  1. 历史似乎重复;
  2. 我不能保持分支机构的历史.

这是我做的:

$ git clone ssh://.../repo.git
$ cd repo
$ git filter-branch --subdirectory-filter subdirectory HEAD -- --all
$ git reset --hard
$ git gc --aggressive
$ git prune
Run Code Online (Sandbox Code Playgroud)

在此之后,我似乎拥有了回购和新历史的原始历史.我输入"git log --all --graph"(或gitk --all)我看到,作为第一个提交,第一个repo的初始提交.然后,图表显示原始repo的完整历史记录,直到最后一次提交.然后,我在第一个上面有一个SECOND历史,显示了我想要的子文件夹的历史.但在历史的那一部分,我只有"主人",没有分支/合并.

"git log",gitk或gitg都只显示"flatten"历史记录:它们不会在子文件夹的展平历史之前显示初始回购的历史记录.

我尝试使用"filter-branch"命令,克隆生成的repo(使用--no-hardlinks),使用:

$ git filter-branch --subdirectory-filter subdirectory -- --all
Run Code Online (Sandbox Code Playgroud)

代替:

$ git filter-branch --subdirectory-filter subdirectory HEAD -- --all
Run Code Online (Sandbox Code Playgroud)

但结果相同.

我做错了什么或者git坏了吗?我真的没有想法......使用git 1.7.6.谢谢.

编辑:我认为问题可能来自于filter-branch忽略了merge提交的事实,因此给出了没有分支或合并的平面历史记录......

git

11
推荐指数
1
解决办法
4405
查看次数

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中提取历史子集?

更新:我试图简化这里的真实示例以清楚地解释我的选项,但这并没有真正起作用.到目前为止,下面的链接示例过于笼统,甚至无法使用这个简单的示例.

我能够一直用SVN做这种事情并且非常熟练.现在我发现在Git中非常困难,并开始相信我的历史基本上太过密集,无法将它拉开.

真实世界的问题:我已经移动并重命名了十几个文件.他们的历史与数百个其他文件的历史混杂在一起,我想完全删除历史记录.

在SVN中,我可以使用dump/include-filter/exclude-filter/load序列来修剪存储库,很少我可能需要在加载之前在转储文件中手动重命名路径.

像这样的东西,我会做的:

SET Includes=trunk/src/Foo.aaa trunk/src/Foo.bbb trunk/src/Foo trunk/src/Bar
SET Excludes=trunk/src/Bar/Blah.aaa trunk/src/Foo/Blah.aaa

svnadmin dump FooSrc > Full.dump 2> Dump.log
svndumpfilter include %Includes% --skip-missing-merge-sources --renumber-revs --drop-empty-revs < Full.dump > Filter_1.dump 2> Filter_1.log
svndumpfilter exclude %Excludes% --skip-missing-merge-sources --renumber-revs --drop-empty-revs < Filter_1.dump > Filter_2.dump 2> Filter_2.log
svnadmin create FooDest
svnadmin load FooDest --ignore-uuid < Filter_2.dump > Load.log 2> Load_Errors.log
Run Code Online (Sandbox Code Playgroud)

有没有人有一个很好的例子,这不仅仅是一个简单的删除单个文件或导出单个子目录?

我可以定义文件集的最简单方法是使用7个目录路径的列表.这些目录中的所有内容都需要保存,外部的所有内容都需要从历史记录中删除.


简化问题:

我有一个Git存储库,它有一些我想要提取到自己的存储库中的文件.问题是这些文件是在原始存储库的整个历史记录中创建和修改的,因此我无法弄清楚如何干净地提取它们.

以下是我的历史记录的要点(只有更多的提交和更多要忽略).正如你所看到的,我显然不打算稍后将这些文件从历史中挑选出来:

commit 4a09d3f977a8595d9e3f61766a5fd743e4265a56

M    src/Foo/Bar/FileToExtract2.foo
A    src/Foo/Bar/FileToExtract3.bar
D    src/Foo/AnotherFileToIgnore.txt

commit 05d26f23518083270cc45bf037ced29bec45e064

M    src/Foo/Blah/IgnoreThisOneToo.foo
M    src/Foo/AnotherFileToIgnore.txt

commit 343187228f4bd8e4427395453034c34ebd9a95f3 …
Run Code Online (Sandbox Code Playgroud)

git version-control history

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

是否有可能在另一个git仓库中有一个git repo

我有一个用git管理的django项目.我是git把它推给我的主人.现在,我希望能够将其中一个目录(包括所有子目录)推送到另一个git仓库.如果可能的话,怎么可能呢?

编辑:所以我希望该目录本身就是一个git repo.

git git-submodules

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

Git只创建一个只有指定目录的新分支,然后将其历史记录推送到新的存储库

我想在我的仓库中创建一个新的分支,它只包含来自master中特定目录的文件及其历史记录,然后将该分支推送到新的存储库.

...或类似的东西 - 例如,可以将目录推送到新的存储库到新的存储库而无需创建分支.

到目前为止,我认为以下内容可行,但我想知道是否有更简化的方法.

1 - 创建一个空分支:

git symbolic-ref HEAD refs/heads/<new-branch>
rm .git/index 
git clean -fdx
Run Code Online (Sandbox Code Playgroud)

2 - 从主服务器中检出目录:

git checkout master <paths> ...
git add <paths> ...
git commit
Run Code Online (Sandbox Code Playgroud)

3 - 将分支推送到新远程:

git push -u <remote-URL> <new-branch>
Run Code Online (Sandbox Code Playgroud)

4 - 然后,在新的repo中,与master合并分支:

git checkout -t origin/<new-branch>
git checkout master
git merge <new-branch>
git branch -d afterimage
git branch -d -r afterimage
Run Code Online (Sandbox Code Playgroud)

我正在尝试将与Detach子目录等效的东西放到单独的Git存储库中,但没有git filter-branch乱七八糟的东西.

git branch git-filter-branch

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

为什么git-filter-branch没有重写标签?

我需要将我的git repo分成两部分.我使用了这里显示的步骤:Detach(move)子目录到单独的Git存储库中

我使用的命令是:

 git filter-branch --subdirectory-filter ABC HEAD -- --all
Run Code Online (Sandbox Code Playgroud)

这似乎很好,并留下了ABC作为根.

但是现在,如果我尝试检查在拆分回购之前存在的标记:

 git checkout an-old-tagname
Run Code Online (Sandbox Code Playgroud)

它正在重新创建旧的目录结构 - 所以重新创建ABC作为子目录,以及XYZ1和XYZ2.

我知道回购真正看到了那个时间点 - 但我希望标签只引用ABC位,好像它们当时已经在根部.我认为这是filter-branch在重写历史时所做的事情,但显然我并没有正确地理解它.

如何重新编写标签,以便我可以回到过去,同时仍然将ABC作为回购的根源?

git git-filter-branch

9
推荐指数
1
解决办法
4103
查看次数