问题在于:我有很多代码,包括我需要版本的GUI的图片,以便忠实地重新创建软件产品.我也在Windows和Mac上工作.我正在处理的实际代码每天都会变化很小.但是,所有相关资源在构建之前总共大约几GB.
从我的在线研究来看,似乎git-subtree或git-submodule是我需要用来保持我的git存储库快速的.
我相信很多git用户在那里遇到了类似的问题,并且面临同样的决定.
您使用了哪种方法,以及您遇到的问题?
我正在开发一个用于我的项目的框架 ; 然而,框架的开发到目前为止没有上下文:即我需要开始在现实项目中使用它,并具体看到我需要添加,修复或调整的东西(可能是在测试环境中工作的东西)适用于现实生活中的情况,或者某些事情没有意义,或者我想添加功能).
首先,由于Framework显然是一项正在进行中的工作,我需要确保它在Real-life项目中作为其中的不同部分保持更新,因此我可以回到Framework,编辑它,提交,返回到现实生活中的项目更新框架,继续与项目合作.
其次,我真的想要一种在不进行项目切换的情况下实现这一目标的方法.我的意思是我希望能够在Real-life项目中编辑Framework并将这些提交推送到Framework存储库.
现在,我知道这些工具来实现这一最有可能git submodule和git subtree,但他们两人都相当混乱.特别是子模块似乎更倾向于采用只读方法(例如,保持库始终更新):这将满足我的第一个要求,但不满足第二个要求.
有关如何使用Git实现此目的的任何指示以及工作流程的外观如何?
我有一个相当困难的情况:在一个项目(git repo)中我有一个文件,我需要它在另一个项目(另一个git repo).有没有明确的(并且可能的)简单方法将它放入我的项目中?它看起来像:
git-repo-1:
lib/foo
lib/ololo
git-repo-2:
lib/*foo* (from repo-1)
lib/bar
lib/baz
Run Code Online (Sandbox Code Playgroud)
我的问题是:1.我该怎么办?2.如何将文件(包括git-repo-1)更新到我的仓库(git-repo-2)?
ps是的,看过很多关于子树的页面,但是......对我来说还是不太清楚.有什么建议?甚至指令;-)我会非常感激任何事情.
UPD:我想要的:http://git-scm.com/book/en/Git-Tools-Subtree-Merging但是!我想只将"机架"存储库的一部分放入我的项目仓库.
问题是:如何从一个仓库拆分我需要的文件并将其合并到另一个仓库?
我正在处理2个项目,这些项目存储在2 git repos Project1和Project2中
Project1是一个javascript项目.它有自己的回购协议(例如https://github.com/gandra/project1.git)
Project2的是一个Java Maven项目.它有自己的回购(例如 https://github.com/gandra/project2.git)
这是我想要改进的当前工作流程:
我想以某种方式避免第3步(将Project1/build内容手动复制到Project2/libs/project1-lib目录中)我想将Project1作为子树集成到Project2中但是这种方法的问题是因为它获取了所有Project1目录结构到Project2/libs/project1-lib,我只想获取Project1的子目录(Project1/build/*)
一些重要的注意事项:Project1更改仅在其自己的存储库中发生(https://github.com/gandra/project1.git),此更改应传播到Project2.所以没有从Project2/libs/project1-lib更新Project1换句话说:
- Project1中的提交影响Project2
- Project2中的提交不影响Project1
我有大约20个不同的存储库.许多是独立的并且编译为库,但是其他一些在它们之间具有依赖性.依赖性解析和分支很复杂.
假设我有一个只聚合所有其他存储库的超级项目.它专门用于运行测试 - 这里没有真正的发展.
/superproject [master, HEAD]
/a [master, HEAD]
/b [master, HEAD]
/c [master, HEAD]
/...
Run Code Online (Sandbox Code Playgroud)
现在,为每个(a)开发特定的功能或修复,特别是需要特定版本的项目编译或运行的那些(b v2.0和c 3.0)我必须创建一个新的分支:
/superproject [branch-a, HEAD] <-- branch for 'a' project
/a [master] <-- new commits here
/b [v2.0]
/c [v3.0]
Run Code Online (Sandbox Code Playgroud)
因为b,可能需要其他东西,比如a v0.9和c v3.1:
/superproject [branch-b, HEAD] <-- branch for 'b' project
/a [v0.9] <-- older version than 'a'
/b [master] <-- new commits go here
/c [v3.1] <-- …Run Code Online (Sandbox Code Playgroud) 我有两个存储库:parent和child. 他们都使用 git-lfs。我正在尝试child作为子树导入到parent.
在parent目录中时,我尝试添加它并得到以下信息:
> git subtree add --prefix child [child_url]
git fetch [child_url] master
From [child_url]
* branch master -> FETCH_HEAD
Downloading [child_binary_file_path] (12.55 KB)
Error downloading object: [child_binary_file_path] ([sha])
Errors logged to .git\lfs\objects\logs\20170613T115607.1992713.log
Use `git lfs logs last` to view the log.
error: external filter git-lfs smudge -- %f failed 2
error: external filter git-lfs smudge -- %f failed
fatal: [child_binary_file_path]: smudge filter lfs failed
Run Code Online (Sandbox Code Playgroud)
在日志文件中,我看到
Error downloading …Run Code Online (Sandbox Code Playgroud) 我有一个在“ external /”文件夹中包含两个子树的仓库。
克隆存储库时,它将下载所有文件,包括我先前在git subtree命令之后推送的代码。
现在,如果我想在另一台机器上克隆该仓库并重新创建子树结构,则git subtree add命令将失败,因为我要放置子树的文件夹已经包含该文件夹和文件。
这些是我运行的命令:
> git clone https://URL/<main>
> git remote add <component> https://URL/<component>
> cd <main>
> git subtree add --prefix external/<component> <component> master
ERROR: prefix 'external/<component>' already exists.
Run Code Online (Sandbox Code Playgroud)
如何解决呢?还是有更好的方法为新的克隆操作重新创建子树结构?
我有一个远程存储库,我们称之为subrepo。我想将其作为子树包含在本地存储库中,我们将其称为mainrepo。我将把subrepo放在路径“subrepofold/”下。
我像往常一样添加了遥控器:
git remote add subrepo git@remote.subrepo.git
Run Code Online (Sandbox Code Playgroud)
在mainrepo上我只有一个分支(master)。我添加并承诺了所有:
git add --all
git commit -m "message"
git status
Run Code Online (Sandbox Code Playgroud)
在分支 master 上没有任何可提交的内容,工作目录干净
git diff-index HEAD --exit-code --quiet
Run Code Online (Sandbox Code Playgroud)
不给我输出。跑步:
git subtree pull --prefix="subrepofold" subrepo master --squash
Run Code Online (Sandbox Code Playgroud)
我收到以下消息:
工作树有修改。无法添加。
我知道这似乎正是此处描述的问题,但似乎没有一个回复能够解决该问题。
我有一个存储库的子文件夹,我试图将其拆分为子树。首先,我按照此过程(/sf/answers/3078972851/)创建一个仅包含与子文件夹相关的提交(包括重命名)的分支。我确认分支的提交日志看起来符合预期。
接下来,我为该子项目创建一个新的存储库:
git init --bare \\nas\git\FPF.git
git push ssh://myserver.com/~/FPF.git branch-fpf:master
Run Code Online (Sandbox Code Playgroud)
然后我从父存储库中删除子文件夹并将其重新添加为子树:
git rm -r htdocs/wp-content/plugins/fpf
git add -A
git commit -am "Removing folder to re-add as subtree"
git remote add fpf ssh://myserver.com/~/FPF.git
git subtree add --prefix=htdocs/wp-content/plugins/fpf fpf master --squash
Run Code Online (Sandbox Code Playgroud)
现在,作为快速健全性检查,我将获取远程子树存储库的副本(当然在另一个文件夹中):
git clone ssh://myserver.com/~/FPF.git
Run Code Online (Sandbox Code Playgroud)
和:
git subtree push --prefix=htdocs/wp-content/plugins/fpf fpf master
Run Code Online (Sandbox Code Playgroud)
因为我在添加子树和推送之间没有提交任何更改,所以我希望没有任何新内容可以推送。但事实证明,如果我再次克隆 FPF.git,我发现它现在有大量额外的提交 - FPF 已经变大很多倍,提交日志现在反映了许多仅适用于外部文件的提交子树。
为什么git subtree push会推送不适用于子树的提交?
编辑 1:额外提交是来自主(父)存储库的所有提交,从第一次 FPF 提交之前开始并返回到时间开始。换句话说:如果我在执行 git 子树推送之前和之后比较 FPF 子树存储库的日志,它们是相同的,直到我到达“预推送”克隆日志的底部。从那里开始,“推后”克隆的日志一直持续到父项目的第一次提交。Git 子树推送有效地附加了父级的完整先前历史记录。
编辑2:我决定放弃git-subtree。我发现了https://github.com/ingydotnet/git-subrepo,它不仅可以正常工作,而且解决了许多子树的缺点(最明显的是非常慢的推送)。将此问题留在这里,以防其他人提出答案或遇到同样的问题,但为了简化一点,这里有一组完整的从头到尾的命令来展示该问题。与上面的区别:这并不是从多个过滤器分支嫁接在一起形成的分支开始;它只是执行最简单的单个子树分割的情况:
cd MainProjectRepo
git subtree …Run Code Online (Sandbox Code Playgroud) 我只是git subtree split在我的主分支上运行但是子树(dist分支)缺少分支上的最后两个提交master.我不知道该怎么做.我之前没有碰到这个.它始终没有问题.
这是我的github网络图(不包括dist):

从主分支我跑了git subtree split -P dist -b dist.
如果我git log从dist分支运行它会显示最近的提交6d1620a.在哪里17c1f31和33dfc67?
谁知道这里发生了什么?
我正在使用Yeoman生成的项目使用的部署方法.基本上意味着我有一个整体项目文件夹,其中有一个dev(或app)目录,其中所有开发都已完成,而dist目录是构建项目的目录(通过gulp构建过程).所以要部署我只需将dist目录拆分到它自己的分支中,然后将其推送到实时服务器.
看起来像这样:
gulp
git checkout master
git merge --no-ff dev
git subtree split -P dist -b dist
git push
Run Code Online (Sandbox Code Playgroud)
或者git subtree push -P dist origin dist也可以.