GIT:之后删除不必要的文件

问题描述 投票:2回答:2

我和其他人有一个团结项目。自从。到目前为止,gitignore还没有正常工作,GIT中有许多不必要的文件夹。

我知道我可以用这种方式删除所有不必要的文件:

 git rm -r --cached . 
 git add .
 git commit -m 'Removed all files that are in the .gitignore' 
 git push origin master

但为什么其他人仍然推送应该被忽略的文件?为了阻止这种情况发生,他们需要做些什么?

# =============== #
# Unity generated #
# =============== #
Temp/
Library/

# ===================================== #
# Visual Studio / MonoDevelop generated #
# ===================================== #
ExportedObj/
obj/
*.svd
*.userprefs
*.csproj
*.pidb
*.suo
*.sln
*.user
*.unityproj
*.booproj

# ============ #
# OS generated #
# ============ #
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
.idea
git unity3d
2个回答
2
投票

比这更复杂。 git rm --cachedactually删除索引中的文件并推送修改。这意味着如果有人编辑了文件,则会产生修改/删除冲突。他们可以解决保存档案的冲突,他们仍然在那里。


0
投票

首先,你应该明白.gitignore并不意味着“忽略这些文件”。 Git应该将此文件命名为.git-dont-complain-about-these-files-if-they-are-untracked-and-dont-automatically-add-these-files-to-the-index-if-they-are-untracked-but-note-that-this-has-no-effect-at-all-on-tracked-files,而不仅仅是.gitignore,但是谁想要在每次都输入所有内容?

接下来,您和您的整个团队 - 需要了解“未跟踪文件”的真正含义。幸运的是,Git中未跟踪文件的定义非常简单:未跟踪文件是不在索引中的文件。如果文件在索引中,则会对其进行跟踪。如果它不在索引中,则它是未跟踪的。

唉,这通常让每个人都对“指数”感到疑惑。这特别糟糕,因为索引是Git中的一个核心概念,每个人都必须理解才能正确使用Git。 Git教程总是提到索引,它在Git中有三个不同的名称:索引,登台区域和缓存。但许多人认为它是一个模糊的,令人费解的实体,或者不能很好地解释它。 Git的索引有几个不同的角色,解释所有这些角色有点棘手,特别是因为索引很难看到;但是对于第一个近似值,索引只是每个文件的副本,这些文件将进入您进行的下一次提交。

(这是索引获取名称暂存区域的位置。如果文件现在位于索引中,并且您运行git commit,那么现在索引中的副本就是进入提交的副本。因此,该文件位于提交中。注意,当git status说“staged”时,它特别意味着文件是(a)在索引中,(b)在索引中与当前提交中的不同。)

这就是为什么Git一遍又一遍地让你git add相同的文件。当你有一个现有的提交时,它有一堆文件。这些文件也在索引中,其内容与注释中的内容相同。而且,这些相同的文件位于您的工作树中 - 您在文件上工作的地方 - (最初无论如何)与提交和索引中的内容相同。您必须使用git add将旧内容复制到旧内容上,才能使用该文件的较新版本。

无论如何,要使文件不在索引中,必须使用git rm filename将其从索引中删除。默认情况下,这会从索引和工作树中删除该文件。使用git rm --cached filename,您可以告诉Git从索引中删除该文件,同时将其保留在工作树中。现在它不在你的索引中,它是一个未跟踪的文件,所以现在.gitignore可以影响它。

现在进行新提交时,由于该文件不在索引中,因此它也不在新提交中。这会产生问题。

假设您或您的同事已签出旧提交,并且旧提交中包含该文件。因为你有旧的提交签出,文件在你的索引 - 记住,你的索引匹配你的签出提交 - 以及你的工作树:Git用它复制到你的索引的文件填充你的工作树在你正在检查的提交。您现在已跟踪文件(因此不会被忽略)。如果你git checkout新的提交,没有跟踪文件,Git将立即从你的索引中删除该文件...并从工作树中删除该文件。

好消息是,您现在处于未提交文件的提交中,因此索引中没有该文件。所以现在文件没有跟踪。坏消息是,文件甚至没有,因为Git删除了它。

每次从具有该文件的提交切换到不具有该文件的提交时,Git都会执行此操作,因为当您在具有该文件的提交时,该文件在提交中并因此被复制进入索引并因此复制到您的工作树中,但您正在从该提交切换到没有该文件的提交,因此Git将其从索引中删除并将其从工作树中删除。

不幸的是,这是您通过在某些提交中使用该文件而选择的路径,而不是在其他提交中使用该文件。要将文件保留在工作树中,您必须将其重命名,然后从“具有该文件的提交”切换到“没有该文件的提交”。 Git将从索引中删除该文件(很棒)并尝试将其从工作树中删除(失败,但Git并不关心,因为结果是正确的)。然后你可以安全地重命名它。但是,在您切换这些旧提交时,您必须始终执行此操作。

同时,每个要进行新提交的人都必须确保他们也在必要时从索引中删除文件,以便所有新提交都省略该文件,这样当他们获取这些文件时它不会返回到其他人的索引中。新提交,然后检查出来。

There is one other option

不是让每个人都从他们拥有的每个索引中删除文件,而是在将索引与工作树进行比较时,可以选择指示Git跳过文件的工作树版本。这允许您将文件保留在索引中(以便不会忽略该文件),但也会让Git不会将更新版本添加到索引中(以便您的索引版本保持原样)。为此,您可以使用git update-index --skip-worktree filename

注意:我不推荐这种工作方法。它可以工作,但是每个用户都必须为每个要以这种方式跳过的索引文件执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.