忽略子文件夹中的.git文件夹

时间:2014-03-27 10:43:40

标签: git

是否可以将具有.git文件夹的子文件夹添加到repo中,而不将Git视为子模块?我尝试过不同的方法来忽略.git文件夹,但到目前为止还没有任何工作。

我在/.gitignore尝试过:

/vendor/**/.git/

..和/vendor/.gitignore:

.git/

我想忽略的.git文件夹位于/ vendor / foo / bar /.

7 个答案:

答案 0 :(得分:0)

你的问题引起了我的兴趣,所以我试了一下:

$ cd /tmp
$ git init foo
Initialized empty Git repository in /private/tmp/foo/.git/
$ cd foo
$ git init bar
Initialized empty Git repository in /private/tmp/foo/bar/.git/
$ cd bar
$ echo "this is bar" > bar.txt
$ git add bar.txt
$ git commit -m "initial commit"
[master (root-commit) c9d6507] initial commit
 1 file changed, 1 insertion(+)
 create mode 100644 bar.txt
$ cd ..
$ pwd
/tmp/foo
$ git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        bar/

nothing added to commit but untracked files present (use "git add" to track)
$ git add bar
$ git commit -m "parent initial commit"
[master (root-commit) b23e106] parent initial commit
 1 file changed, 1 insertion(+)
 create mode 100644 bar/bar.txt
$ echo "baz" > bar/.git/baz.txt
$ git status
On branch master
nothing to commit, working tree clean

根据您的问题,/tmp/foo是一个Git存储库。对于/tmp/foo/tmp/foo/bar是一个子目录,它本身有一个.git目录。

如您所见,父foo存储库完全忽略了bar/.git子目录,我甚至不需要.gitignore文件。

Git没有办法将包含.git文件夹的路径作为子模块处理,而不在.gitmodules文件中注册。

答案 1 :(得分:0)

jthill answer一样,您可以使用.git添加子目录中的任何项目,它将被视为子目录而不是子模块。

但是,如果您已将此子目录注册为具有.git的子模块,则必须首先删除该子模块,但将其保留在工作树中git rm --cached a/submodule

有关详细信息: How do I remove a submodule?

然后您可以从jthill answer重复步骤。

根据我的研究,无法停止将.git文件夹视为子模块。因此,我现在能够想到的最佳解决方案是使用bash或任何类似的脚本,您可以在控制台的任何文件夹中运行。它应该找到任何具有.git的子文件夹,并尝试将该文件夹中的任何文件添加到主.git,因此它将停止将它们视为子模块。

以下代码来源: Bash script to automatically convert git submodules to regular files

#!/bin/bash

# Get a list of all the submodules
submodules=($(git config --file .gitmodules --get-regexp path | awk '{ print $2 }'))

# Loop over submodules and convert to regular files
for submodule in "${submodules[@]}"
do  
   echo "Removing $submodule"
   git rm --cached $submodule # Delete references to submodule HEAD
   rm -rf $submodule/.git* # Remove submodule .git references to prevent confusion from main repo
   git add $submodule # Add the left over files from the submodule to the main repo
   git commit -m "Converting submodule $submodule to regular files" # Commit the new regular files!
done

# Finally remove the submodule mapping
git rm.gitmodules

请记住在尝试新脚本之前始终提交/备份更改,以防止任何工作/数据丢失。

答案 2 :(得分:0)

虽然它是真的.git被自动忽略,但主回购会将/vendor/foo/bar视为gitlink(主回购索引中的特殊条目),而不是常规文件。

一个技巧只是移动 bar/.git 主回购之外:

  • vendor/foo/bar将被视为常规子文件夹,如果需要,可以添加到主仓库中。
  • 如果您在git命令之前加GIT_DIR=/path/to/bar/.git git ...
  • ,则bar repo可随时检测更改并进行提交

例如:

cd /path/to/main/repo/vendor/foo/bar
GIT_DIR=/path/to/bar/.git git status
GIT_DIR=/path/to/bar/.git git add .
GIT_DIR=/path/to/bar/.git git commit -m "changes to bar"
GIT_DIR=/path/to/bar/.git git push

答案 3 :(得分:0)

您可以先直接添加一些(任何)内部内容。 Git在搜索新遇到的目录时通过遇到.git条目来检测子模块,但是如果你给它一个实际的路径来查找该目录,它就不会搜索。

所以

git add path/to/some/submodule/file     # bypass initial search that detects .git
git add path/to/some/submodule          # now git's index has it as ordinary dir

答案 4 :(得分:0)

您可以使用 git hooks 来实现您的目标。开箱即用,您可以创建一个预提交钩子,重命名您所包含项目的 .git 目录,例如。 to&#34; .git2&#34;,添加后一个项目中的所有文件,除了&#34; .git2&#34;目录,提交全部,推送它,最后使用提交后挂钩重命名&#34; .git2&#34;文件夹回到&#34; .git&#34;在你的模块中。

1)在 root repo的 .git / hooks / 下创建预提交文件,内容为:

typedef struct credit_card_s
{
  unsigned char is_valid;

  unsigned char data[];

} credit_card_t;

2)在 .git / hooks / 下创建提交后文件,内容为:

#!/bin/sh
mv "vendor/foo/bar/.git" "vendor/foo/bar/.git2"

git rm --cached vendor/foo/bar
git add vendor/foo/bar/*
git reset vendor/foo/bar/.git2

3)更改仓库中的文件,最后:

#!/bin/sh
mv "vendor/foo/bar/.git2" "vendor/foo/bar/.git"

My Original answer

答案 5 :(得分:0)

您可以为此使用Git排除。

首先,创建一个.gitexclude文件:

$ echo "vendor/*/.git" >> .gitexclude

然后将此文件作为排除源添加到您的Git配置中:

$ git config core.excludesFile .gitexclude

现在您可以添加文件,而Git则不提供将其添加为子模块:

$ git add vendor
$

您可以使用git check-ignore来验证文件对Git确实“不可见”:

$ git check-ignore vendor/foo/.git
vendor/foo/.git
$ git check-ignore vendor/foo/bar.txt
$

参考: man git-add(1) man git-check-ignore(1)

答案 6 :(得分:-1)

你试过通配符吗?

**/vendor/.git/