1

我的主目录是一个 git 存储库。但是为了让我可以自由地创建/删除/测试代码而不弄乱git status,我的 .gitignore 有一个明确的忽略所有:

[svenglar@my_box ~]$ cat ~/.gitignore
## Ignore everything by default.
## Use 'git add --force <file>' to add a file/dir.
*

我假设这意味着当我创建一个新目录时,它不会包含在存储库中。但情况似乎并非如此:

[svenglar@my_box ~]$ git rev-parse --is-inside-work-tree
true
[svenglar@my_box ~]$ mkdir test
[svenglar@my_box ~]$ cd test
[svenglar@my_box ~/test]$ git rev-parse --is-inside-work-tree
true
[svenglar@my_box ~/test]$ git status
# On branch master
nothing to commit, working directory clean

我看到这git status很干净,但git rev-parse --is-inside-work-tree认为新目录是存储库的一部分。

所以我的问题是,如何配置 git 以不将新目录视为工作树的一部分?

--更新--

我首先问这个的原因是因为我在使用 git repos 时使用 .git-prompt.sh 来修改 BASH 的提示。我的主文件夹下有多个项目(文件夹)是 git repos。当我 cd 到其中一个目录时,我想查看哪个分支处于活动状态,等等...

但是当我在“home”存储库中时,我不需要/不想使用 .git-prompt.sh,因为我不认为这是一个“work”目录。

我的解决方法是在最后一个“printf”命令之前使用以下检查修改 .git-prompt.sh:

 # Only modify $PS1 if we are not in the home repository.
 [[ $(git rev-parse --show-toplevel) =~ "${HOME}/" ]] && printf -- "$printf_format" "$c${b##refs/heads/}${f:+ $f}$r$p"

我以前只检查是否pwd包含${HOME}/(最后一个正斜杠表示我在子目录中)。

感谢您的所有回答。他们帮助我理解了为什么我错了。

4

3 回答 3

1

你不能。

用于strace git rev-parse --is-inside-work-tree查看它在做什么。如果在树的深处,您会看到其中的许多:

chdir("..")                             = 0
stat(".git", 0x7fff22ababa0)            = -1 ENOENT (No such file or directory)

Git 只是.git在整个文件系统中查找目录。如果它找到一个,你就在一棵工作树中。

您可以在专用子目录中设置工作树并使用符号链接显式添加要跟踪的内容,而不是从 git 中排除内容。

于 2013-06-05T19:52:06.587 回答
0

Git 认为一切都在工作树中。 .gitignore只是告诉 git 在提交时要忽略哪些文件。你最好不要使用你的主目录作为你的回购根目录。相反,使用子目录。

于 2013-06-05T19:42:04.010 回答
0

你不能。这是有道理的。

下面的任何目录.git都被认为是项目的一部分。否则,您将如何使用源代码?

如果你真的不想这样,请将 git 存储库作为裸露在你的外部$HOMEGIT_DIR在你的环境中设置;然后设置GIT_WORK_TREE为您$HOME想要使用它的时间。

于 2013-06-05T19:42:16.210 回答