如何压缩并忽略.gitignore文件中指定的所有文件

7

我有几十个Git存储库位于一个目录下,它们不仅包含源代码,还包括构建产物、开发者产物、BLOB和其他通常被.gitignore忽略的数据。

我想快速将这些源代码传输到另一台计算机。是否有一种简单的方法来打包所有不被git忽略的内容?

提供更多上下文:

我大约有50个不同分支的Git文件夹,每个文件夹都有一些当前的更改。

我想复制由git跟踪的所有文件,处于当前状态(当前分支加上当前本地更改)。

如果克隆这些文件夹意味着要进入每个文件夹,本地提交当前更改,记住分支名称,将本地分支git克隆到另一个文件夹中,重复50次,那么我强烈反对这种方式。


1
源代码没有历史记录?https://git-scm.com/docs/git-archive - phd
3
为什么不直接克隆它们全部? - Stephen Newell
我能在所有 git 树之外的上层使用这些命令吗? 我有几十个 git 文件夹都在一个文件夹下面,一个一个运行命令很麻烦。 - qkhanhpro
您提到了关于未进行版本控制的构件的担忧,如果它们被复制过来是否会有问题?如果没有问题:可以复制/粘贴基础文件夹或从中创建.tgz文件。 - LeGEC
@StephenNewell,我在问题中添加了更多的上下文。 - qkhanhpro
3个回答

8

简洁表述:

$ alias gitzip="git archive HEAD -o ${PWD##*/}.zip"
$ cd mydir
$ gitzip

很遗憾,这只能压缩已提交的文件,而不能压缩未暂存的更改。 - Igor L.
它还会压缩.gitignore文件。 - Muzammil

3

如果你想包含历史记录,请使用git bundle(如果您的存储库有子模块,可以使用xeyownt/git-subundle)。

请参考这个脚本作为示例:

for repository in ${repositories[@]}
do
  echo "$repository..."
  declare file_name="../$repository-$(git rev-parse --short HEAD).bundle"
  cd $repository
  if [ -f $file_name ]; then
    echo 'Found bundle is current'
  else
    git bundle create $file_name --all
  fi
  cd -
done

每个仓库都提供一个文件(不包含任何私人或已忽略的文件),你可以轻松复制它,一旦复制完成,可以进行克隆。

2
你可以尝试这个:

你可以尝试这个:

for dir in repo1 repo2 repo3; do
    git -C "$dir" ls-files | perl -pe "s[^][$dir/]"
done | zip /tmp/test.zip -@

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接