我正在开始一个新的Zend Framework项目,我将与设计师合作.我将使用git维护这个项目代码,通常设计师不会说git(或任何编程语言),所以我想让他的事情变得简单,否则我恐怕他根本不会使用git.我的计划是给他一些Git gui,并且他应该只使用基本的git功能,例如commit,diff,fetch,merge,push和pull.
我正在使用gitolite来维护我们的git存储库的共享副本,因为它有一个精细的权限系统,我将只为设计者提供RW访问权限(设计)和对其他分支的读访问权限.
为了简单起见,我想与他分享主项目中的一些文件夹(遵循ZF推荐的结构),他确实需要访问它才能完成工作.与此同时,我希望我们两个人仍然能够相互融合.
他的分支的结构减少应该是这样的:
<project name>/
application/
layouts/
scripts/
views/
scripts/
public/
css/
images/
js/
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用子模块完成这项任务,但维护起来会很麻烦,因为我应该将项目拆分到(至少)4子库中,他应该只能访问子库,并且他有3个存储库可以使用.因此,如果这是唯一的解决方案,我会放弃这个想法.
我已经读过的一些链接让我觉得我所要求的是可能的:
这是我的问题:
design(git checkout -b design和git mv/rm?)git merge design从主分支,反之亦然)我找到了另外两种可能解决这两个问题的方法
我尝试git rm all-unneeded-stuff在设计分支中实现第一个后,我在主分支中进行提交,其中涉及白名单路径中的文件和黑名单路径中的另一个文件,但是git merge失败并显示以下消息
CONFLICT (delete/modify): application/Bootstrap.php deleted in HEAD and modified in master. Version master of application/Bootstrap.php left in tree.
Run Code Online (Sandbox Code Playgroud)
然后我在master分支中添加了一个新目录,当从设计中合并时,添加了新目录.我在驱动程序中添加了一些调试回声,我发现在两种情况下都没有调用它,可能是因为它不是真正的合并.
我还没有尝试过第二种方法(.gitignore),但是如果我已经理解这种方法不符合我的需求,因为它只会忽略设计分支中列入黑名单的文件,但是它们会在设计分公司,打破了我的要求.
我把我的实验推到了GitHub上
我认为目前没有解决方案.使用当前的git实现,这根本无法实现.
我想要反驳,但我担心它不会发生.
是否有一种简单的方法来移动使用以下cmd添加的子树
git subtree add --prefix=<prefix> <repository> <commit>
Run Code Online (Sandbox Code Playgroud)
换句话说,是否可以将前缀更改dir1为dir2.
git子树的答案:可以在分叉存储库中更改子树分支/路径吗?建议删除子树然后添加回来.
它对我不起作用,因为我需要保留本地提交,还有另外一种方法吗?
我一直在研究git子模块,git子树和稀疏检查,我根本无法绕过它.这是我的用例:
我有一个repo,比方说frontend-repo,它不仅包含基于AngularJS的前端的文件,还包含与测试,文档等相关的一些文件夹.此repo中的子文件夹,称为"codebase",存储HTML,CSS和JS为应用程序.
我有另一个回购,让我们说backend-repo,它持有python/flask后端,它最初服务于AngularJS应用程序.这些文件需要位于application/static子文件夹中.
在进行开发和测试时,我们需要在application/static,debug,test,iterate中编辑文件直到完成.基本上,我一直在尝试使用git找到一种方法,将前端/ codebase文件夹本地检出到后端repo中.子模块我无法上班; 子树似乎也无法处理这个用例.
这里的最佳做法是什么?我可以简单地从一个目录设置一个符号链接到另一个目录,但我希望git有一个更好的方法来做到这一点.有没有人有这种工作流程的经验?
我希望使用git子树来使用我在项目仓库中拥有的框架仓库.这应该是这样的:
使用Sourcetree应用程序的Windows我做了以下:
这导致我这样的事情:
然后Sourcetree告诉我test.txt没有为commit提交,所以我添加它并提交它.
我可能使用它错了,但我找不到一种方法来确保test.txt实际上被添加到框架repo而不是项目/框架,因为它似乎是.
如果我按下这个,我按预期在project/framework/test.txt中得到了正确的文件,但是框架repo仍然是空的(它没有收到我做的更改)
我以为我必须手动推送子树将这些更改提交到框架repo但它似乎无休止地循环而不给我任何错误
我让它运行超过10分钟,但没有得到任何结果.任何帮助将非常感激.
谢谢你的时间.
我想在我的一个项目中使用子树,并使用此处描述的方法.在从子树中删除某些文件的情况下,将子树合并到子项目中时遇到问题.似乎在合并期间文件删除不会从子树集成分支传播到主分支.
我在Kubuntu 14.04上运行Git 1.9.1,并在我的主项目中集成.sub_projectsubtree
修改一个文件并删除我的另一个文件 sub_project
提交修改
浏览我的主项目
签出sub_project集成分支
拉修改(我看到修改后的文件的修改和删除的删除文件)
检查master我的主项目的分支
git diff-tree -p sub_project_branch 表示已修改一个文件,并且已删除一个文件
执行我的子树集成分支到主分支的合并(删除的文件仍在那里,而修改已集成)
以下是相应的命令:
创建将用作子树的项目
$ mkdir sub_project
$ cd sub_project
$ git init
$ touch toto
$ echo "-----------------" >> toto
$ echo "- toto file">> toto
$ echo "-----------------" >> toto
$ touch tata
$ echo "-----------------" >> tata
$ echo "- tata file">> tata
$ echo "-----------------" >> tata
$ git add toto …Run Code Online (Sandbox Code Playgroud) 我有一个很大的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 subtree add --prefix etc/theos https://github.com/theos/theos.git master --squash
但这个回购通常是用--recursive旗帜克隆的,我注意到回购中应该存在的东西没有.
我没有看到--recursive子树的标志.我怎样才能让它发挥作用
在添加子树时:
git subtree add --prefix = vendor https://example.com/repo master --squash
创建了两个提交.一个用于压缩子树提交
Squashed 'vendor' changes from 15fc2b6..c6dc29b
Run Code Online (Sandbox Code Playgroud)
和合并提交
Merge commit 'SHA1' into master
Run Code Online (Sandbox Code Playgroud)
当我想将此更改推送到gerrit时,它需要一个changeID.但是git不允许我这样做
git rebase -i HEAD~2
和我做任何其他提交一样的返工,因为它是一个被压扁的提交.
由于这个原因,我无法将这种变化推向格里特.我无法直接将更改提交到头(git)并破坏超模块上的内容.它必须经过构建和测试.任何建议或帮助表示赞赏.
我们最近决定从TFVC迁移到Git,我正在尝试寻找设计新Git架构的最佳方法。
我们的代码由独立但紧密耦合的模块组成,让我们看一下以下项目:
CommonLib1
CommonLib2
ApplicationA(使用CommonLib1)
ApplicationB(用途CommonLib1&CommonLib2)
虽然CommonLib1/ CommonLib2是完全独立的,几乎每一个新功能ApplicationA/ ApplicationB需要修改CommonLib1/ CommonLib2。
此外,在添加新功能时,我们希望创建一个跨我们所有项目的分支。
据我了解,我还有两个主要选择:
为每个项目创建一个仓库,并在/中添加CommonLib1/ CommonLib2作为子树。ApplicationAApplicationB
为所有项目创建一个Monorepo。
对于我的情况,最佳的Git实践是什么?