Git-创建存储库并仅跟踪新文件

时间:2018-08-18 06:41:56

标签: git

是否可以在非空目录中初始化新的git存储库,并跟踪初始化后新添加的仅 个文件/文件夹,而忽略旧文件/文件夹。例如:

初始化新存储库之前的当前文件夹结构:

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

4 个答案:

答案 0 :(得分:3)

Git只会使用git add跟踪您明确告诉您的文件。因此,您无需执行任何操作:只是不要告诉Git跟踪您不希望其跟踪的文件。

如果您查看git status,这会很烦人,它将列出所有未跟踪的文件。

对此也有一个简单的解决方案:只需忽略所有文件:

echo '*' > .gitignore

这将告诉Git忽略所有文件。您仍然可以使用git add -f将单个文件添加到存储库中(-f是强制Git忽略文件被忽略的事实所必需的。)

如果要使用git add .git add somedirectory添加所有新文件,则需要在.gitignore中单独列出所有要忽略的文件。您可以使用我上面描述的“烦人”事实,即git status将列出所有未跟踪的文件:

git status --porcelain -uall | grep -E '^\?\? ' | cut -d ' ' -f2- > .gitignore

--porcelaingit status的输出格式指定为“瓷v1”格式。瓷器输出格式保证从不更改,并且设计成易于通过机器解析,这与短或长输出格式不同,后者设计成易于读取,因此可以更改以使其成为可能更容易阅读。 -uall告诉git status列出所有个未跟踪的文件,否则,如果目录中的所有文件均未跟踪,则只会列出目录名称。

grep查找以??开头的行,这是列出未跟踪文件的方式。然后cut切出??之后的所有内容,即文件名。

注意:例如,这将以名为abc\n?? def.txt的文件中断。如果您有此类文件,则需要通过以下方式强化命令:使用-z的{​​{1}}标志来打印以ASCII NUL代替换行符的记录。

答案 1 :(得分:0)

如果git仅忽略少量文件,则可以使用git的gitignore功能。 要创建简单的gitignore,请按照以下步骤操作:

  1. 在您的存储库文件夹中,创建一个名为.gitignore的文件
  2. 使用任何文本编辑器(例如记事本,notepad ++等)打开文件。
  3. 列出您要被git忽略的所有文件,并在每个单独的行上列出每个文件的名称。 例如。

    文件夹A 文件夹B file1.php file2.php

有关更复杂的gitignore,请参见:

您还可以使用诸如https://www.gitignore.io/之类的工具为您生成一个gitignore文件。

希望这会有所帮助。

答案 2 :(得分:0)

git init本身无法做到这一点,至少据我所知。但是一点点贝壳魔术就可以解决问题:

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

初始化存储库后,您仍需要在提交之前添加文件(包括.gitignore)。

答案 3 :(得分:-1)

最后我排除了所有文件/文件夹,只包括特定的文件/文件夹。这是我所做的:

  1. 在目录根目录下创建一个空的.gitignore文件,并添加*以取消跟踪所有文件和文件夹
  2. 在该目录中初始化一个新的存储库
  3. 通过添加特定的文件和文件夹来编辑.gitignore,从现在开始

我最终的.gitignore现在使用以下模式:

# Ignore everything
*

# Include folders
!/folderC
!/folderD

# Include files
!file3.php
!file4.php

# Include files containing
!*foo*

此解决方法目前似乎工作正常。感谢Jörg W MittagMichael H.的回答,我被指出了正确的方向。

其他SO用户也提供了一些有用的资源:

Make .gitignore ignore everything except a few files

How do I tell Git to ignore everything except a subdirectory?

git ignore filenames which contain