我有一个带有两个分支的Git存储库:master和redesign.该redesign分支是从那时创建的master,并且master从那时起就没有被触及:
master
...|--m50--\
\--m51--|--m52--|--m53-- redesign
Run Code Online (Sandbox Code Playgroud)
该redesign分行已经发展这么多,我想从它创建一个新的整体存储库,以第一次提交的redesign作为初始提交新的存储库中,忘记以前的历史继承自master:
master
...|--m50--
redesign
--r1--|--r2--|--r3--
Run Code Online (Sandbox Code Playgroud)
这可能与Git有关吗?有一个相关的问题,但它的目标是使用目录,而不是分支.
谢谢!
你能提供一个(全部或最常见的)操作或命令列表,这些操作或命令会危害git中的历史记录吗?
什么应该绝对避免?
git commit/ git push/ git commit --amend)我希望这个问题(如果它还没有在其他地方之前提出过)成为关于git上常见的可避免操作的某种参考.
此外,我使用git reset了很多,但我还没有完全意识到我可以对存储库(或其他贡献者副本)造成的损害.可能git reset有危险吗?
免责声明:我已经看到Detach(move)子目录进入单独的Git存储库,但它没有完全回答这个问题.
我已经将一个项目从svn迁移到git.当它存在于svn中时,一些文件被移动和/或重命名.
在git迁移之后,一些提交只能在 git log --follow
所以:
git结构如下:
MyMainRepo/
.git/
XYZ/
ABC/myFile.txt
Run Code Online (Sandbox Code Playgroud)
git log ABC/myFile.txt show: - commit1 - commit2
git log --follow ABC/myFile.txt 显示: - commit1 - commit2 - commit3(那时ABC目录不存在)...
现在,当拆分git repo以获得一个独特的ABC git repo时:
git log --follow ABC/myFile.txt现在丢失了旧的历史记录,我只是:
我想要的是什么:
欢迎任何帮助:)
我们将一个项目分配到自己的代码库中,但它将紧跟其分支的项目.
我看到它像这样工作:
分叉项目将对品牌产品进行一些初步更改.我不想与原始项目共享这些更改,但是我希望合并更改.
我们设置它的方式是单独的repos,它们现在具有相同的历史记录,只需为彼此添加遥控器.
我想到的工作流程如下:
我们应该尝试使用功能分支,每个功能只有1个提交,这样我们每个人都可以选择.无论何时处理某个功能并进行提交,只需在该功能的分支中执行git commit --amend.当它最终确定时,我可以挑选提交.
我不喜欢这个,因为如果在挑选樱桃之后功能发生变化,开发人员需要记住不会结束但是创建一个新的提交.
我希望通过合并或rebase来做到这一点.
也许已经有了一个解决方案,但其他问题/答案似乎解决了稍微不同的问题(或者我真的不理解它们).
我的目的是分离Git存储库的子目录并使其成为一个独立的存储库,同时保持历史记录不变,但只保留子目录的历史记录. 这个问题首先似乎可以解决问题,但后来我发现了一个缺陷:
git filter-branch --subdirectory-filter仅保留与给定子目录相关的提交.但是,这意味着提交消除它的影响是在子目录的文件,现在不过从其他地点已经搬到那里.
我注意到了这一点,因为我的'清理'存储库的第一次提交是'将所有内容移动到子目录X'.这意味着我的文件之前已经在另一个位置,但是从那时起的提交没有被保留.
所以我需要的是一个命令(或命令序列):
B)
这些提交中的某些提交还可能包含与这些条件不匹配的文件.如果这些文件可以从存储库中完全修剪,这将是一个不错的附加组件.
编辑:
上面链接的解决方案将新存储库中的subdir内容拉到repo的根目录.正如@Amber指出的那样,这会导致已经存在于根目录中的文件出现问题.所以我想要实现的是:
原始目录结构:
\Old-Repo
\.git
\ABC
|- dir content
\DEF
|- dir content
\GHI
|- dir content
Run Code Online (Sandbox Code Playgroud)
分离存储库的目录结构应该是:
\New-Repo-DEF
\.git
\DEF
|- dir content
Run Code Online (Sandbox Code Playgroud)
并不是:
\New-Repo-DEF
\.git
content of old DEF subdirectory
Run Code Online (Sandbox Code Playgroud)
然后我会通过常规提交将内容从DEF子目录移动到根目录.
我有一个git存储库,它有几个提交到不同的子目录,我想以下面的方式将存储库切成两个:
/
sub1/
sub2/
sub3/
Run Code Online (Sandbox Code Playgroud)
->
/
sub1/
Run Code Online (Sandbox Code Playgroud)
个别潜艇已发展到sub1应该是独立存储库的地步.此外,没有一个提交触及多个子.
因此,我想以某种方式提取一个新的存储库,该存储库只接受提交,sub1同时保留所有其他内容.但我想保留历史记录(但没有相关的提交sub2也没有sub3).
注意:我依稀记得有一些命令可以做到这一点,但我自己从未使用它,也不记得它被称为什么,所以我无法搜索它.
假设我有两个git回购.RepoA是一个应该在其他项目中共享的通用回购.ReopB是一些需要访问RepoA中的东西的项目.
RepoA
https://.../RepoA
/Something
/Source
/Project1
/Project2
...
/ProjectN
Run Code Online (Sandbox Code Playgroud)
RepoB
https://.../RepoB
/SomethingElse
/Source
/MainProject
/RepoA
/Project1 #Submodule of RepoA at /Source/Project1
Run Code Online (Sandbox Code Playgroud)
使用上面的图解,您可以看到我要做的是配置一个不是RepoA根目录的子模块,而是配置回购中的特定路径.在这种情况下,我想将RepoB/Source/RepoA/Project1映射到RepoA/Source/Project1.
我做了一些研究,似乎并不是直截了当,也可能是不可能做到这一点.我希望我错了!
我们正在从SVN迁移到GIT,在SVN中,我们使用Externals轻松完成此任务.
注意
我也愿意重组RepoA.但我想保持主体结构.例如,如果我能以某种方式在RepoA/Source/...内分支每个项目,但我不希望这变得复杂.
我有一个很大的Git项目,我想用他们自己的存储库解剖到子项目中.Git的子树是完成这项任务的理想选择:首先
使用仅一个子文件夹的内容创建一个分支
git subtree split -P <name-of-folder> -b <name-of-new-branch>
Run Code Online (Sandbox Code Playgroud)
然后
将此分支拉入另一个存储库.
对于过渡阶段,我希望子项目是只读的,并从master中同步它们.对于每个要掌握的提交,我当然可以对所有子项目重复执行上述过程,但这似乎不太理想,因为它重新完成所有工作.
有没有办法将master合并到子树分支中?
这个问题与以下内容有关:
我想分离一对,而不是分离一个子目录.例如,这是我的文件夹结构:
/app1
/file1
/file2
/folder1
/folder2
/app2
/file3
/file4
/folder3
/folder4
/test
/file5
/file6
/folder5
/folder6
/README.md
/new_file
Run Code Online (Sandbox Code Playgroud)
而我想这样做:
/app1
/file1
/file2
/folder1
/folder2
/app2
/file3
/file4
/folder3
/folder4
Run Code Online (Sandbox Code Playgroud)
我尝试了以下替代方案,到目前为止还没有工作:
git filter-branch --index-filter 'git rm --cached -qr -- . && git reset -q $GIT_COMMIT -- /app1/* app2/*' --prune-empty -- --all
Error:
pathspec '.' did not match any files
Run Code Online (Sandbox Code Playgroud)
第二次尝试:
git filter-branch --tree-filter "mkdir samples; mv app1 app2 samples/" HEAD
Error:
rename app1 to …Run Code Online (Sandbox Code Playgroud) 我有一个git存储库,它使用Vagrant为WordPress项目构建虚拟服务器(仅限本地开发).文件夹结构大致如下(出于问题的目的).
- Vagrantfile
- puppet/
- wordpress/
- {www public folder / root Wordpress files}
- files/
Run Code Online (Sandbox Code Playgroud)
现在所有这些文件都在我的存储库的根目录中,我希望它们留在那里,所以如果我需要向Vagrant添加任何更新,它们将被添加到repo中.现在,我的主机能够通过使用git直接推送更新来允许我部署到我的登台和生产服务器.但是这些文件存储在/ wordpress /中,其服务器上的源是根.理想情况下,我只想从/ wordpress /文件夹推送到远程源的根目录.
我想将/ wordpress /文件夹移动到项目的根目录,然后将所有Vagrant文件推送到生产服务器(除非有办法添加特定于远程源的.gitignore).
我确信有几种方法可以实现这一点,我也查看了git子树,但对于这个具体问题看起来有点过分.如果有人能提出最佳解决方案,我们将不胜感激.