相关疑难解决方法(0)

如何使用git管理多个相似但不同的项目?

我基于类似的代码库有多个不同的闭源项目,每一天我都需要将更改和修复从一个复制到另一个并返回.

由于我的一些项目分散太多而无法使用git子模块,而在其他项目中,我不希望我的客户弄乱子模块,因此我现在可以查看我在其他项目上的工作git patch,git apply这是一项繁琐的工作.

我将考虑切换到我的机器上的本地存储库之间,git pull然后git push使用git cherry-pickgit merge获取所需的更改,但是如果有更好的方法吗?

git multiple-repositories

7
推荐指数
2
解决办法
1268
查看次数

将git存储库组合到子目录中时出错

我已经看过几个解决这个问题的线程.

组合多个git存储库

组合多个git存储库,名称中包含空格

我还查看了git filter-branch手册页.


更新

我已经改为2脚本系统:

#!/bin/bash
git filter-branch --index-filter '~/doit.sh' HEAD
Run Code Online (Sandbox Code Playgroud)

和doit.sh

#!/bin/bash
git ls-files -s | \ 
    sed "s-\t-&data/perl_modules/-" | \ 
    GIT_INDEX_FILE="$GIT_INDEX_FILE.new" git update-index --index-info && \
    mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"
Run Code Online (Sandbox Code Playgroud)

这避免了以前的错误,但现在得到了这个(用[...]替换了路径):

Rewrite c35e4ef0626fb2045f57fa5b605e7663b8d06196 (1/10977)mv: cannot stat `[...]/.git-rewrite/t/../index.new': No such file or directory
index filter failed: ~/doit.sh
Run Code Online (Sandbox Code Playgroud)

我跑的时候

ls-files- s | sed ... | git update-index ...
Run Code Online (Sandbox Code Playgroud)

我得到它应该生成的索引文件.当我更改doit.sh文件以输出sed的结果而不是将其传递给git update-index时,它似乎产生了正确的输出......似乎git update-index在下面运行时根本就不创建文件--index过滤器....


再次更新:

当我改变

mv"$ GIT_INDEX_FILE.new""$ GIT_INDEX_FILE"

mv"$ GIT_INDEX_FILE.new""$ GIT_INDEX_FILE"|| 真正

它失败了第一个MV,但所有其他(到目前为止)都在工作.


所有这些都在这个脚本中达到了高潮:

git filter-branch --index-filter \
    'git ls-files …
Run Code Online (Sandbox Code Playgroud)

git history

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

将多个孤立分支组合成一个分支

我有一个包含多个存储库的目录,它看起来像这样:

folder
|- repo1
|  |- .git
|  |- File1.txt
|- repo2
|  |- .git
|  |- File2.txt
|- repo3
|  |- .git
|  |- File3
Run Code Online (Sandbox Code Playgroud)

我想将它们组合成单个git存储库,我按照这些说明进行了操作.

在这些指令之后,我有以下结构:

folder
|- .git
|- repo1
|  |- File1.txt
|- repo2
|  |- File2.txt
|- repo3
|  |- File3
Run Code Online (Sandbox Code Playgroud)

这很棒.但是现在我有主分支(来自repo1)和历史上的两个孤儿分支:

* Merge repo3
|\
| * Add third file
* Merge repo2
|\ 
| * Add second file
* Add first file
Run Code Online (Sandbox Code Playgroud)

我想得到的是这样的

* Merge repo 3
* Add third file …
Run Code Online (Sandbox Code Playgroud)

git

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

如何将现有CVS模块导入现有git存储库的子目录中

我正在复制一个相当古老的代码项目,从我定期使用CVS开始,作为我已经在使用git工作的新项目中的一个组件.我仍然可以访问CVS存档旧项目的模块是的,所以我只是要使用git-cvsimport得到提交历史,并从那里走.但是,这只是在当前的一个内部创建一个新的git存储库.完全有可能我需要这样做一个多步骤的过程,我去CVS - >新的git存储库,然后使用其他东西将它带入现有的git存储库.

在newproj/newsubdir中运行它($ CVSROOT已在我的shell配置中正确设置):

git cvsimport -k -o master -u -s \- -A ~/Documents/cvs-authors.txt oldproj
Run Code Online (Sandbox Code Playgroud)

让我一个全新的存储库取名为NewProj/newsubdir/git的/所有正确提交的(注释,时间戳,历史),并与HEAD,我想它.

我想要的是历史CVS提交就好像它们总是在newproj/newsubdir/oldproj-file1,newproj/newsubdir/oldproj-file2等等.根据我的经验,git有做这种事情的魔力,但我找不到明显适合我的情况.

git cvs

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

你如何结合两个git回购?

我有一个与我合作的主回购(回购1).我有另一个需要适应第一个的回购(回购2),我不知道如何将它们放在同一个文件夹中.我的想法是,我在每个项目中都有一个标准的代码库 - 但每个项目都是它自己的git repo.

/project
    /.git(repo 2)
    /.git(repo 1)
    /repo_2_sub
        /repo_2_sub_sub
            /repo_1_sub_sub
    /repo_1_sub
        /repo_1_sub_sub
        /repo_2_sub_sub
Run Code Online (Sandbox Code Playgroud)

没有文件重叠 - 但有些文件夹结构.所以有时来自一个仓库的某些文件夹将在另一个仓库中.

我如何工作,以便这两个存储库构建完整的代码库?

UPDATE

两个git repos都存在于同一个根项目文件夹级别.它们不能是子模块,因为它们如上所示来回穿过彼此.它们不是单独的文件夹.

更新2

等等,也许这比我想象的要容易.你可以克隆一个标准的代码库repo,然后创建一个新的分支,这是你的项目,然后每次更改时,只是继续将该分支与codebase repo合并?

git

5
推荐指数
1
解决办法
1526
查看次数

如何将几个Git仓库合并为一个并交织历史

我的情况是我有两个Git存储库,我需要将它们合并到一个存储库中(实际上有更多的存储库,但是我可以从两个开始)。

这两个存储库是:

  • 主存储库,
  • 所述第二存储库,

在库中的代码对在库中的代码依赖性(但反之亦然),和两个库的历史彼此跟随以时间的方式-大致(即一个特定的在回购提交通常需要从回购提交一个具有非常相似的提交时间)。

两个存储库中的分支名称和标记名称冲突(不能保证它们都属于同一名称),但是仅需要保留A中的引用。

新存储库C的要求是:

  1. 所有的裁判(分支和标签)一个需要被保留。
  2. 仅需要保留来自B的master分支提交(即,由报告的提交git log --first-parent master)。
  3. 每个源存储库中的文件应放入新存储库的子文件夹中(即,A中的文件应放入A/B格式的文件应放入B/)。
  4. 当检查出具体的承诺(包括完成提交合并)在库Ç(例如某个发布标签)兼容的文件形成两个源库应在目录中找到A/B/(至少在提交或两个)。

到目前为止,我已经尝试了几种方法,包括thisgit-stitch-repo,但是没有成功(它们没有满足上述要求)。

在这一点上,我已经设法:

  • 使用git filter-branch将每个仓库中的所有文件移动到一个子目录。例如回购A
mkdir A
mv * .gitignore A / 2> / dev / null
git commit -a -m'DROPME'> …

git git-rewrite-history

5
推荐指数
1
解决办法
1075
查看次数

如何组合两个单独的Git存储库?

我克隆了一个git repo,里面有我的emacs配置文件.我想在一个子目录中添加pylookup.这样做的正确方法是什么?

以下是我能想到的选项.


  1. 如果我将其克隆到~/.emacs.d/pylookup/并将该文件夹添加到我的emacs仓库中,那么当我这样做时,它会正确更新:

    cd ~/.emacs.d/pylookup/
    git pull
    cd ~/.emacs.d
    git commit -a -m "updates to pylookup"
    git push
    
    Run Code Online (Sandbox Code Playgroud)

    即,当我在其他机器上提取这些更改时,我会有新版本的pylookup吗?

  2. pylookup/*每当pylookup更新时,我是否只是让我的emacs repo忽略并在每台机器上更新它.如果有一些repo和几台机器,这会很烦人,但我可以忍受它.

  3. 是否有一些聪明的技巧git submodule.如果是这样,你能提供解释我真的不懂文档.我如何为emacs和pylookup提取更改.

  4. 我是否使用答案2,但制作一个脚本来更新所有子回购.如果我这样做,每次pylookup改变时我都可以在每台机器上运行一次.


几个可能的相关职位.

git

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

git pull 在特定存储库上产生“错误:更新以下目录将丢失其中未跟踪的文件”

当我使用git pull 时,我收到“错误:更新以下目录将丢失其中未跟踪的文件:”消息。

我有两个不同的存储库,我将其称为“good”和“abc”。我正在尝试按照此处描述的过程将它们合并到父存储库中,以保留原始历史记录。这涉及在git filter-branch的帮助下重写历史记录,然后将两个存储库拉入新初始化的父存储库。这是失败的步骤:

git pull abc/

remote: Counting objects: 237, done.
remote: Compressing objects: 100% (67/67), done.
remote: Total 237 (delta 129), reused 161 (delta 129)
Receiving objects: 100% (237/237), 54.99 KiB | 0 bytes/s, done.
Resolving deltas: 100% (129/129), done.
From abc
 * branch            HEAD       -> FETCH_HEAD
error: Updating the following directories would lose untracked files in it:
    abc/abc
Run Code Online (Sandbox Code Playgroud)

现在,如果我拉出“好”存储库,即使在重写历史记录后它也能正常工作。或者如果我在重写历史之前git pull abc,它也很顺利。这似乎是特定于“abc”回购与过滤器分支程序相结合的。所以问题是,这个存储库可能有什么问题导致这个错误?我该如何解决它?

完整的命令和输出序列如下所示:

:~$ mkdir gitexp
:~$ …
Run Code Online (Sandbox Code Playgroud)

git merge pull github

0
推荐指数
1
解决办法
8050
查看次数