Git-创建存储库并仅跟踪新文件
是否可以在非空目录中初始化新的git存储库,并只跟踪初始化后新添加的文件/文件夹,而忽略旧文件/文件夹。例如: 初始化新回购之前的当前文件夹结构:Git-创建存储库并仅跟踪新文件,git,Git,是否可以在非空目录中初始化新的git存储库,并只跟踪初始化后新添加的文件/文件夹,而忽略旧文件/文件夹。例如: 初始化新回购之前的当前文件夹结构: FolderA/ FolderB/ file1.php file2.php 初始化新回购并创建新文件和目录后: FolderA/ // old, ignore FolderB/ // old, ignore FolderC/ // new, track file1.php // old, ignore file2.php // old,
FolderA/
FolderB/
file1.php
file2.php
初始化新回购并创建新文件和目录后:
FolderA/ // old, ignore
FolderB/ // old, ignore
FolderC/ // new, track
file1.php // old, ignore
file2.php // old, ignore
file3.php // new, track
如果git只能忽略少量文件,那么可以使用git的
gitignore
功能。
要创建简单的gitignore,请执行以下步骤:
.gitignore
gitignore
信息,请参阅:
gitignore
文件之类的工具
希望这有帮助。
gitinit
本身无法做到这一点,至少据我所知。但是一点贝壳魔法就可以做到:
cd /path/to/directory/
touch .gitignore # creates file .gitignore if not yet existing
for file in *; do
echo $file >> .gitignore
done # appends all the filenames of files in directory to file .gitignore
git init # inits the repository
在repo初始化之后,您仍然需要在提交之前添加文件(包括
.gitignore
)。Git将只跟踪您明确告诉它使用Git add
的文件。因此,您无需做任何事情:只是不要告诉Git跟踪您不希望它跟踪的文件
如果查看git status
,它会列出所有未跟踪的文件,这可能会让人恼火
还有一个简单的解决方案:忽略所有文件:
这将告诉Git忽略所有文件。您仍然可以使用git add-f
将单个文件添加到存储库中(强制git忽略文件被忽略的事实需要-f
)
如果要使用git add.
或git add somedirectory
添加所有新文件,则需要在.gitignore
中单独列出要忽略的所有文件。您可以使用我上面描述的“恼人”事实,即git status
将列出所有未跟踪的文件:
git status --porcelain -uall | grep -E '^\?\? ' | cut -d ' ' -f2- > .gitignore
--ceral
将git status的输出格式指定为“ceral v1”格式。陶瓷输出格式保证永远不会更改,并且设计为易于机器解析,而不像短或长输出格式,短或长输出格式设计为人类可读,因此可能会更改以使其更易于阅读-uall
告诉git status
列出所有未跟踪的文件,否则仅当目录中的所有文件都未跟踪时才会列出目录名
grep
查找以??
开头的行,这是未跟踪文件的列表方式。然后,剪切
会剪切文件名??
后面的所有内容
注意:这将与名为
abc\n??例如,def.txt
。如果您有这样的文件,您需要强化命令,例如使用-z
标志到git status
,它打印由ASCII NUL分隔的记录,而不是换行符。I最终排除所有文件/文件夹,只包括特定的文件/文件夹。以下是我所做的:
.gitignore
文件,并添加了*
以取消对所有文件和文件夹的跟踪.gitignore
,方法是添加从此点开始要跟踪的特定文件和文件夹# Ignore everything
*
# Include folders
!/folderC
!/folderD
# Include files
!file3.php
!file4.php
# Include files containing
!*foo*
这一变通办法目前似乎运作良好。多亏了你的回答,我被指引了正确的方向
其他SO用户也提供了一些有用的资源:
忽略是通过创建一个名为
.gitignore
的文件来完成的,该文件包含要忽略的文件的特定模式。所以我认为,gitinit
不能直接帮助您满足这个特定的需求;以*存档;执行echo$file>>.gitignore;如果直接在git init之前执行,则done可能很有用?(应该适用于Linux/Mac和Windows上的Git Bash)我应该在初始化之前创建.gitignore并定义要手动跟踪的文件,同时排除所有其他文件夹/文件吗?上面的shell命令会这样做。请尝试一下,看看这是否是你想要做的。但需要明确的是:默认情况下,git将尝试跟踪所有内容,除了与中的模式匹配的文件。gitignore
文件,请参阅。所以你不需要定义git应该跟踪哪些文件,只有git应该忽略的文件。谢谢Michael。我的结构被简化了,但是真正的项目有超过10k个文件,所以在gitignore中添加所有文件是不可取的。我猜如果我创建一个新的gitignore,在开始时排除所有(*),然后明确允许特定的文件/文件夹(!folderC,!file3.php)等…也应该这样做吗?10k文件顶级?这似乎很奇怪。无论如何,我想你可以这样做,尽管我不确定这是否是处理git的常见模式…是的,如果我在init之前创建gitignore,排除所有(*),然后手动添加特定的文件/文件夹,它就会起作用-这个想法来自你的第一条评论。如果你修改你的答案,我可以接受。谢谢很高兴我能帮忙。我不会以这种方式修改我的答案,因为即使它可以忽略除某些路径之外的所有内容,但这并不是我建议的解决方案。很公平,理论上没有。gitignore
,你也可以做得很好。如果您选择这种方式,使用git status
肯定会在某些时候变得不愉快。事实上,git status
将准确列出您要忽略的文件,因此您可以轻松创建.git
# Ignore everything
*
# Include folders
!/folderC
!/folderD
# Include files
!file3.php
!file4.php
# Include files containing
!*foo*