我和其他人有一个团结项目。自从。到目前为止,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
答案 0 :(得分:2)
比这更复杂。 git rm --cached
实际上会删除索引中的文件并推送修改。这意味着如果有人编辑了文件,则会产生修改/删除冲突。他们可以解决保存档案的冲突,他们仍然在那里。
答案 1 :(得分: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中有三个不同的名称: index , staging area 和 cache 。但许多人认为它是一个模糊的,令人费解的实体,或者不能很好地解释它。 Git的索引有几个不同的角色,解释所有这些都有点棘手,特别是因为索引很难看到; 但是对于第一个近似,索引只是一个副本每个文件将进入下一次提交。(这是索引获取名称临时区域的位置。如果文件现在位于索引 ,并且您运行git commit
,则副本索引现在是进入提交的那个。因此,索引中的那个是分阶段。注意当{{1说" staged",具体意味着该文件是(a)索引中的和(b)不同,来自当前提交中的内容。)
这就是为什么Git一遍又一遍地让你git status
同样的文件。当你有一个现有的提交时,它有一堆文件。这些文件在索引中也是 ,其内容与注释中的内容相同。而且,这些相同的文件位于您的工作树 - 您在文件上工作的地方 - (最初无论如何)与提交和索引中的内容相同。您必须使用git add
将新内容复制到旧内容上,才能使用该文件的较新版本。
无论如何,要使文件在索引中不,必须使用git add
将其从索引中删除。默认情况下,这会从索引和中删除工作树中的文件。使用git rm filename
,您可以告诉Git从索引中删除该文件,同时将其留在工作树中。现在它在索引中不,它是未跟踪文件,因此现在 git rm --cached filename
可以影响它。
现在进行新提交时,由于文件不在索引中,因此它也不会在新提交中。这会产生问题。
假设您或您的同事已签出旧提交,并且旧提交中包含该文件。因为你有旧的提交签出,文件在你的索引 - 记住,你的索引匹配你的签出提交 - 以及你的工作树:Git用它复制到你的索引的文件填充你的工作树在您提交的提交中。您现在已跟踪文件(因此不会被忽略)。如果.gitignore
新提交,未跟踪 ,则Git会立即从索引中删除该文件... 并删除该文件也来自你的工作树。
好消息是,您现在处于未提交文件的提交中,因此索引中没有该文件。所以现在文件没有跟踪。坏消息是,该文件甚至不是那里,因为Git将其删除了。
每次从具有该文件的提交切换到没有该文件的提交时,Git都会执行此操作,因为当您进行提交时 拥有该文件,该文件在提交中,因此被复制到索引中,因此被复制到您的工作树中,但您正在从该提交切换到不提交的提交。 t 拥有该文件,因此Git会将其从索引中删除并将其从工作树中删除。
不幸的是,这是您通过在某些提交中使用该文件而未在其他提交中使用该文件而选择的路径。要将文件保留在工作树中,您必须将其重命名,然后从"提交具有文件"的提交。 to"提交没有文件"。 Git将从索引中删除该文件(很棒)并尝试将其从工作树中删除(失败,但Git并不关心,因为结果是正确的)。然后你可以安全地重命名它。但是,当你切换这些旧提交时,你必须这样做。
与此同时,所有人要进行新提交必须确保他们还在必要时从索引中删除该文件,以便所有新提交省略该文件,以便在获取这些新提交然后检查它们时,它不会返回到其他人的索引。< / p>
不是让所有人从他们拥有的每个索引中删除该文件,您可以选择在比较时将Git指向跳过您文件的工作树版本工作树的索引。这允许您将文件保留在索引中(以便不忽略该文件),但也会让Git不会将更新版本添加到索引中(以便您的索引版本保持原样)。为此,您可以使用git checkout
。
注意:我不推荐这种工作方法。它可以工作,但是每个用户都必须为每个要以这种方式跳过的索引文件执行此操作。