标签: git-subtree

用于大型资源的Git子树或Git Sub模块?

问题在于:我有很多代码,包括我需要版本的GUI的图片,以便忠实地重新创建软件产品.我也在Windows和Mac上工作.我正在处理的实际代码每天都会变化很小.但是,所有相关资源在构建之前总共大约几GB.

从我的在线研究来看,似乎git-subtree或git-submodule是我需要用来保持我的git存储库快速的.

我相信很多git用户在那里遇到了类似的问题,并且面临同样的决定.

您使用了哪种方法,以及您遇到的问题?

git git-submodules git-subtree

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

拆分git存储库以同时处理两个项目

我正在开发一个用于我的项目的框架 ; 然而,框架的开发到目前为止没有上下文:即我需要开始在现实项目中使用它,并具体看到我需要添加,修复或调整的东西(可能是在测试环境中工作的东西)适用于现实生活中的情况,或者某些事情没有意义,或者我想添加功能).

首先,由于Framework显然是一项正在进行中的工作,我需要确保它在Real-life项目中作为其中的不同部分保持更新,因此我可以回到Framework,编辑它,提交,返回到现实生活中的项目更新框架,继续与项目合作.

其次,我真的想要一种在不进行项目切换的情况下实现这一目标的方法.我的意思是我希望能够在Real-life项目中编辑Framework并将这些提交推送到Framework存储库.

现在,我知道这些工具来实现这一最有可能git submodulegit subtree,但他们两人都相当混乱.特别是子模块似乎更倾向于采用只读方法(例如,保持库始终更新):这将满足我的第一个要求,但不满足第二个要求.

有关如何使用Git实现此目的的任何指示以及工作流程的外观如何?

git git-submodules git-subtree

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

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但是!我想只将"机架"存储库的一部分放入我的项目仓库.

问题是:如何从一个仓库拆分我需要的文件并将其合并到另一个仓库?

git git-subtree

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

如何将构建输出从一个git repo集成到另一个

我正在处理2个项目,这些项目存储在2 git repos Project1和Project2中

Project1是一个javascript项目.它有自己的回购协议(例如https://github.com/gandra/project1.git)
Project2的是一个Java Maven项目.它有自己的回购(例如 https://github.com/gandra/project2.git)

这是我想要改进的当前工作流程:

  1. 提交Project1中的更改​​并将其推送到原点
  2. 在Project1中运行grunt.这会生成Project1/build目录
  3. 将Project1/build内容手动复制到Project2/libs/project1-lib目录中
  4. 在Project2中提交更改(Project2/libs/project1-lib)
  5. Runk jenkins构建和部署

我想以某种方式避免第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

git git-submodules git-subtree

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

多个git存储库的最佳实践

我有大约20个不同的存储库.许多是独立的并且编译为库,但是其他一些在它们之间具有依赖性.依赖性解析和分支很复杂.

假设我有一个只聚合所有其他存储库的超级项目.它专门用于运行测试 - 这里没有真正的发展.

/superproject  [master, HEAD]
    /a         [master, HEAD]
    /b         [master, HEAD]
    /c         [master, HEAD]
    /...
Run Code Online (Sandbox Code Playgroud)

现在,为每个(a)开发特定的功能或修复,特别是需要特定版本的项目编译或运行的那些(b v2.0c 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.9c 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)

git git-submodules git-subtree git-slave git-repo

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

在使用 git-lfs 时有没有更好的方法来做`git subtree pull`?

我有两个存储库:parentchild. 他们都使用 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)

git git-subtree git-lfs

7
推荐指数
0
解决办法
830
查看次数

带有子树的git clone-前缀已存在

我有一个在“ 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)

如何解决呢?还是有更好的方法为新的克隆操作重新创建子树结构?

git git-subtree

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

拉取 git 子树,工作树已修改

我有一个远程存储库,我们称之为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)

我收到以下消息:

工作树有修改。无法添加。

我知道这似乎正是此处描述的问题,但似乎没有一个回复能够解决该问题。

git-subtree

7
推荐指数
0
解决办法
2450
查看次数

Git 子树推送似乎会推送不适用于子树的提交?

我有一个存储库的子文件夹,我试图将其拆分为子树。首先,我按照此过程(/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 git-subtree

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

为什么git子树缺少提交?

我只是git subtree split在我的主分支上运行但是子树(dist分支)缺少分支上的最后两个提交master.我不知道该怎么做.我之前没有碰到这个.它始终没有问题.

这是我的github网络图(不包括dist):

github网络图

从主分支我跑了git subtree split -P dist -b dist.

如果我git logdist分支运行它会显示最近的提交6d1620a.在哪里17c1f3133dfc67

谁知道这里发生了什么?


更多详细信息特定于我的场景

我正在使用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也可以.

git deployment version-control git-subtree yeoman

6
推荐指数
1
解决办法
525
查看次数