防止Git签出从其他分支复制目录
例如:防止Git签出从其他分支复制目录,git,Git,例如: > # on branch-one > mkdir assets views core > git add . > git status On branch branch-one No commits yet nothing to commit (create/copy files and use "git add" to track) > git commit -m "directories"
> # on branch-one
> mkdir assets views core
> git add .
> git status
On branch branch-one
No commits yet
nothing to commit (create/copy files and use "git add" to track)
> git commit -m "directories"
On branch branch-one
Initial commit
nothing to commit (create/copy files and use "git add" to track)
> git checkout -b branch-two
Switched to a new branch 'branch-two'
> git status
On branch branch-two
No commits yet
nothing to commit (create/copy files and use "git add" to track)
> ls
assets/ core/ views/
第一分店
| assets # directories
| views
| core
第二分队
index.html # only one source file
在这两个分支之间切换时,即从分支一切换到分支二时,将复制分支一中的所有目录
例如:
> # on branch-one
> mkdir assets views core
> git add .
> git status
On branch branch-one
No commits yet
nothing to commit (create/copy files and use "git add" to track)
> git commit -m "directories"
On branch branch-one
Initial commit
nothing to commit (create/copy files and use "git add" to track)
> git checkout -b branch-two
Switched to a new branch 'branch-two'
> git status
On branch branch-two
No commits yet
nothing to commit (create/copy files and use "git add" to track)
> ls
assets/ core/ views/
现在在我的第二分支中,所有的目录都被复制到了我不想要的地方
问题:
如何在分支之间移动而不复制它们之间的源文件或目录?这不是在分支之间复制目录的原因,只是在切换分支时它们没有被删除,因为Git还没有删除它们的理由 问题是你的目录是空的。尝试在其中一个目录中创建一个文件,将其添加并提交到一个分支。然后切换到另一个分支,您将看到该目录消失
为了避免将来出现这种情况,在准备提交目录中的内容之前,不要创建目录。这不是在分支之间复制目录的原因,只是在切换分支时它们没有被删除,因为Git还没有删除它们的理由 问题是你的目录是空的。尝试在其中一个目录中创建一个文件,将其添加并提交到一个分支。然后切换到另一个分支,您将看到该目录消失 为了避免将来出现这种情况,请在准备提交目录中的内容之前不要创建目录。如slhck中所述: Git不跟踪目录;它只跟踪文件 如果目录中没有文件,则在添加或删除文件时,该目录对Git来说不“存在”。特别是,当您从Git索引中删除所有文件并将更改添加到索引中时,该目录将从Git索引中消失。反之亦然,如果目录为空,则不会通过git add添加该目录 因此,问题根本不在于提交历史记录或分支:Git将删除文件,但将忽略它没有概念的目录。它们没有被复制,只是被忽略了它们在目录中的位置 相反,您可能需要自己的工作流来运行—这将永久删除所有未跟踪的目录内容,根据定义,这些内容没有在git中备份,因此请阅读文档并格外小心 要简单地删除空子目录,请使用Christophe Drevet Droguet:
find . -type d -empty -delete
如slhck所述:
Git不跟踪目录;它只跟踪文件
如果目录中没有文件,则在添加或删除文件时,该目录对Git来说不“存在”。特别是,当您从Git索引中删除所有文件并将更改添加到索引中时,该目录将从Git索引中消失。反之亦然,如果目录为空,则不会通过git add添加该目录
因此,问题根本不在于提交历史记录或分支:Git将删除文件,但将忽略它没有概念的目录。它们没有被复制,只是被忽略了它们在目录中的位置
相反,您可能需要自己的工作流来运行—这将永久删除所有未跟踪的目录内容,根据定义,这些内容没有在git中备份,因此请阅读文档并格外小心
要简单地删除空子目录,请使用Christophe Drevet Droguet:
find . -type d -empty -delete
以下是git状态输出中的关键行: 请注意,即使在运行git commit之后,这一行也是如何重复的。这是因为git commit无法创建新的提交,因为仍然没有要提交的文件。1 正如其他人所指出的,Git不存储空目录。这意味着这些只是未跟踪的目录,尽管其中没有文件。它们只是停留在不同的分支之间 一旦您在某个目录中创建了一些文件,并对这些文件进行了提交,Git通常会在该目录变为空时删除该目录,因为您会从在该目录中有一些文件的分支切换到没有任何此类文件的分支 1这有一些额外的副作用。特别是,这意味着您也从未创建过分支1。分支名称通过存储某个提交的哈希ID而存在。如果没有提交,则根本不可能存在分支名称。Git仍然希望在某个分支上,所以您在分支1上,然后在分支2上,但这两个分支都不存在!因此,当您在不存在的分支之间切换时,什么也不会发生
您可以使用git commit-allow empty创建初始空提交。这允许您创建任意多个分支名称,所有选择此初始空提交的分支名称都没有实际意义,这也无助于解决空目录问题。以下是git状态输出中的关键行: 请注意,即使在运行git commit之后,这一行也是如何重复的。这是因为git commit无法创建新的提交,因为仍然没有要提交的文件 t、 一, 正如其他人所指出的,Git不存储空目录。这意味着这些只是未跟踪的目录,尽管其中没有文件。它们只是停留在不同的分支之间 一旦您在某个目录中创建了一些文件,并对这些文件进行了提交,Git通常会在该目录变为空时删除该目录,因为您会从在该目录中有一些文件的分支切换到没有任何此类文件的分支 1这有一些额外的副作用。特别是,这意味着您也从未创建过分支1。分支名称通过存储某个提交的哈希ID而存在。如果没有提交,则根本不可能存在分支名称。Git仍然希望在某个分支上,所以您在分支1上,然后在分支2上,但这两个分支都不存在!因此,当您在不存在的分支之间切换时,什么也不会发生
您可以使用git commit-allow empty创建初始空提交。这允许您在选择此初始空提交时创建任意多个分支名称,但这也没有实际意义,对空目录问题也没有帮助。Ok。。我想我们需要整件事。在提交之前,运行git status。在提交后立即执行同样的操作。检查完第二分支后,立即执行同样的操作。粘贴问题中的所有命令及其输出。。。。发生这种情况是因为Git不会跟踪空目录,并且和.gitignore规则无关。当使用堆栈溢出或建议使用git clean的网站上的其他答案中的建议时,请非常小心,因为此命令会影响所有未跟踪的文件。仅供参考,如果需要,您可以通过在这些文件夹中创建名为.gitkeep的文件来提交空目录,尽管它不再是真正的空目录。在这种情况下,切换到分支2时,目录将不会出现。确定。。我想我们需要整件事。在提交之前,运行git status。在提交后立即执行同样的操作。检查完第二分支后,立即执行同样的操作。粘贴问题中的所有命令及其输出。。。。发生这种情况是因为Git不会跟踪空目录,并且和.gitignore规则无关。当使用堆栈溢出或建议使用git clean的网站上的其他答案中的建议时,请非常小心,因为此命令会影响所有未跟踪的文件。仅供参考,如果需要,您可以通过在这些文件夹中创建名为.gitkeep的文件来提交空目录,尽管它不再是真正的空目录。在这种情况下,切换到分支2时不会显示目录。我建议您在建议使用git clean时添加一个警告,因为这可能是一个破坏性的操作,删除所有未跟踪的文件,而无需恢复它们,除非从备份中恢复。就我个人而言,我发现你的建议是“找到一个很好的方法来实现这一点”。@Matt我接受你的观点,但我也故意不包括粘贴友好命令,因为这有风险。对读者的全面警告:不要从运行命令,以免您无法完全理解:我建议您在建议使用git clean时添加一个警告,因为这可能是一个破坏性的操作,它会删除所有未跟踪的文件,除非从备份中恢复,否则无法恢复这些文件。就我个人而言,我发现你的建议是“找到一个很好的方法来实现这一点”。@Matt我接受你的观点,但我也故意不包括粘贴友好命令,因为这有风险。对读者的全面警告:不要从运行命令,以免您无法完全理解: