我基于类似的代码库有多个不同的闭源项目,每一天我都需要将更改和修复从一个复制到另一个并返回.
由于我的一些项目分散太多而无法使用git子模块,而在其他项目中,我不希望我的客户弄乱子模块,因此我现在可以查看我在其他项目上的工作git patch,git apply这是一项繁琐的工作.
我将考虑切换到我的机器上的本地存储库之间,git pull然后git push使用git cherry-pick并git merge获取所需的更改,但是如果有更好的方法吗?
我已经看过几个解决这个问题的线程.
我还查看了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) 我有一个包含多个存储库的目录,它看起来像这样:
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) 我正在复制一个相当古老的代码项目,从我定期使用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有做这种事情的魔力,但我找不到明显适合我的情况.
我有一个与我合作的主回购(回购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存储库,我需要将它们合并到一个存储库中(实际上有更多的存储库,但是我可以从两个开始)。
这两个存储库是:
在库中的代码乙对在库中的代码依赖性甲(但不反之亦然),和两个库的历史彼此跟随以时间的方式-大致(即一个特定的在回购提交乙通常需要从回购提交一个具有非常相似的提交时间)。
两个存储库中的分支名称和标记名称冲突(不能保证它们都属于同一名称),但是仅需要保留A中的引用。
新存储库C的要求是:
git log --first-parent master)。A/,B格式的文件应放入B/)。A/和B/(至少在提交或两个)。到目前为止,我已经尝试了几种方法,包括this和git-stitch-repo,但是没有成功(它们没有满足上述要求)。
在这一点上,我已经设法:
mkdir A mv * .gitignore A / 2> / dev / null git commit -a -m'DROPME'> …
我克隆了一个git repo,里面有我的emacs配置文件.我想在一个子目录中添加pylookup.这样做的正确方法是什么?
以下是我能想到的选项.
如果我将其克隆到~/.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吗?
pylookup/*每当pylookup更新时,我是否只是让我的emacs repo忽略并在每台机器上更新它.如果有一些repo和几台机器,这会很烦人,但我可以忍受它.
是否有一些聪明的技巧git submodule.如果是这样,你能提供解释我真的不懂文档.我如何为emacs和pylookup提取更改.
我是否使用答案2,但制作一个脚本来更新所有子回购.如果我这样做,每次pylookup改变时我都可以在每台机器上运行一次.
几个可能的相关职位.
当我使用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)