0

背景

我正在将 VCS 迁移到 git。这是通过从旧的 VCS (TFSVC) 中签出并通过脚本签入 git 存储库来完成的。

基本上在这样一个循环中:

for x in $(seq 1 100)
do
  tf get $x  # get version x
  git add .  # add everything to index
  git commit # commit
done

问题

旧的 VCS 包含一个.gitignore,作为迁移过程的一部分,我不希望应用这些模式。这可以很容易地使用git add . --force. 问题是我可能仍然想忽略一些事情。

我试过的

我希望.git/info/exclude用于此目的,但git-add --force显然除了.gitignore规则之外还忽略了这一点。似乎也一样core.excludesFile

理想的解决方案

  • 排除规则.gitignore
  • .git/info/exclude在或其他一些排除文件或模式中使用规则
  • 有点性能,这个过程足够慢
  • 不依赖于修改工作树

一个选项当然是git restore --staged $EXCLUDE_PATH_SPEC在将所有内容添加到索引之后,但我想知道是否没有更好的解决方案。

我似乎记得看到一个用于指定忽略/排除 glob 的选项,但我似乎无法找到它。

也许有一种方法可以使用管道命令来实现这一点,比如git update-index


编辑

我已经添加说明,我不想依赖修改工作树的解决方案(即:移动/修改.gitignore),因为它已被多次建议。主要是因为这些原因:

  1. 有嵌套.gitignore文件
  2. 它们的存在和内容依赖于其他 VCS 的状态,我想完全控制
  3. 有另一个 VCS 跟踪文件,所以任何修改工作树的东西,除了从其他 VCS 增量获取使事情复杂化
  4. 它很可能更慢(尽管可能还不足以成为主要问题)
4

4 回答 4

1

临时删除怎么.gitignore办?

for x in $(seq 1 100)
do
  tf get $x
  mv .gitignore /tmp/
  git add .
  mv /tmp/.gitignore .
  git add .gitignore
  git commit -m commit$x
done
于 2021-05-05T14:08:47.373 回答
1

如果标准便利不是您想要的,请使用核心命令制作您自己的便利。git ls-files让您随心所欲地构建您的排除项,并且git update-index可以采取任何您想要的方式。

git ls-files -ocX /path/to/my/excludes \
| git update-index --add --remove --stdin
git ls-files git update-index
  • --add如果指定的文件不在索引中,则将其添加。
  • --remove如果指定的文件在索引中但丢失,则将其删除。
  • --stdin不是从命令行获取路径列表,而是从标准输入中读取路径列表
于 2021-05-05T19:46:01.637 回答
0

到目前为止,我想出的最佳解决方案可能是使用xargs:!排除路径。

grep --invert-match '^#' < .git/info/exclude |\
 sed 's/^/:!/' |\
 xargs git add --all --force --

对于我的用例来说,它可能工作得很好,但我不确定它是否是最好的解决方案。我不知道它将如何处理复杂的规则,何时xargs会爆炸git add等。希望其他人能提出更好的答案。

于 2021-05-05T13:50:12.533 回答
-2

如果你想忽略 git 中的几个文件,你可以执行以下命令-

git rm -r --cached  .
git  add  .
git  commit  -m  ".gitignore is now working"

点击这里了解详情

于 2021-05-05T13:16:40.713 回答