为什么我的.gitattributes文件无法在我的Mac上运行?

时间:2018-01-27 17:20:42

标签: git macos github version-control text-files

尝试实现基于终端的工作流程,在Github和Git中变得更流畅,我想通过终端将所有本地AppleScript应用程序和脚本上传到存储库。在初始测试上传时,任何具有.scpt扩展名的内容都被视为二进制文件,不会呈现为原始内容,但只允许下载查看原始文件。

因此研究将二进制转换为文本的方法,以便我可以利用版本控制,我找到了“Should the .gitattributes file be in the commit?”并且:

我使用以下方法在终端本地克隆我的回购:

git clone https://github.com/user/foobar.git

cd进入该目录后,我执行:touch .gitattributes

已验证的文件包含:ls -a

open .gitattributes

打开文件

将以下内容添加到.gitattributes

## Explicitly declare text files you want to always be normalized and converted to native line endings on checkout.
*.scpt text

## Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary

回到终端我做git commit -am "adding gitattributes"

运行git push

在浏览器中,我验证文件.gitattributes是否存在且确实存在,我可以将其视为文本。

我将foobar.scpt添加到我的本地目录。在终端中,我运行ls -a以验证foobar是否存在且确实存在。运行git add foobar.scpt,然后使用git commit -am "adding test script"git push

当我在浏览器中打开文件foobar.scpt时,它仍然表示我只能下载以查看原始文件。进一步研究我发现:

我已尝试过上述内容:

  • .gitattributes添加到我的本地.git/info/.gitattributes
  • .gitattributes添加到我的本地.git/info/gitattributes,以复制exclude文件的外观。

我已将gitattributes文件参数更改为:

  • *.scpt text
  • *.scpt diff

在尝试了以上所有内容后,我仍然无法将某些文件作为文本而不是二进制文件。在本地创建gitattributes文件并将其推送到主文件的正确方法是什么,以便Mac文件将呈现为文本而不是二进制文件?

修改

评论提示How would you put an AppleScript script under version control?所以我git rm foobar.scpt , git commit -am“删除了测试”and git push`。

在本地删除foobar后,我将..gitattributes更新为:

## Explicitly declare text files you want to always be normalized and converted to native line endings on checkout.
*.scpt diff=scpt

## Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary

添加到我的配置文件(本地.git/config下):

[diff "scpt"]
  textconv = osadecompile
  binary=true

我创建了一个名为test.scpt的新脚本文件,并通过浏览器和终端上传到仍然生成。我做错了什么?

1 个答案:

答案 0 :(得分:0)

从您的描述中,我不能完全确定.scpt文件实际上是“部分”或“完全”二进制文件。

  • 如果它们是“完全”二进制格式,例如datexebin格式,请使用Git LFS对其进行同样处理。

    git lfs install         # Installs the Git LFS hooks into you ./.git/ folder
    git lfs track "*.scpt"  # Registers the *.scpt file extention as a binary format
    

    注意: 需要双引号才能应用于所有*.scpt文件,而不仅仅是项目根目录中的文件

    这将使用常规的Git工作流程跟踪对文件的更改,因此您可以回滚到某些先前状态。据我了解,Git LFS会按原样存储整个文件,并且不会像git那样跟踪更改,因此请考虑每个文件的多个副本/克隆。大文件很快会导致大型存储库,并且必须定期清除较旧的文件,从而丢失了一些历史记录。

  • 如果它们是“部分”二进制,例如pdfdocx,则可以使用.gitattributes为它们配置“读取器”。 Martin Fenner's article很好地涵盖了这一点(我不会链接随处可见的抄袭副本)。本质上他使用 .gitattributes*.scrpt文件标识不同的差异工具和编辑器,而.gitconfig指定这些工具。

    • PATH/TO/Repository/.gitattributes

      *.docx diff=scptdiff
      
    • SOME/PATH/.gitconfig(我不记得.gitconfig的住处)

      [diff "scptdiff"]
      textconv=SCPT2TEXT ...
      prompt = false
      [alias]
      scptdiff =SCPTDIFF ...
      

    注意: SCPT2TEXT代表*.scpt阅读器/转换器和SCPTDIFF代表*.scpt的差异工具和...的参数(不包括文件名)

    在此文件上有git版本控制。它将为您跟踪更改,但可能会导致合并过程中出现问题;我已经有一段时间没有使用它了,但我记得它运行得很好。

  • 使用.gitattributes还会将文件标记为二进制,在这种情况下git只会在文件周围复制文件,而不会跟踪任何更改。两个人编辑文件将最终覆盖另一个人的工作。这对于不经常更改的数据文件来说意味着更多。

我个人认为您的问题与行尾有关。您似乎正在从CRLF更改为LF,反之亦然。当您推送到中央存储库时,这可能会破坏scpt格式。在推送过程中,将转换行尾并转换为“ mangled”文件,然后从服务器下载“ mangled”文件,结果发现该文件确实已损坏。这可能就是为什么它们在Web界面中不可见的原因。如果您还原了损坏的文件中的行尾,您将再次获得原始的“固定”文件。

我的规则是在Windows <-> Linux之间切换行尾,并留给Linux <-> Linux;将服务器视为Linux框;将Mac OS视为Linux。在系统/本地/用户.gitconfig中进行设置。仅在确实需要的情况下,才在text/crlf中启用text/crlf或禁用.gitattributes行端切换,例如, git下的二进制文件,只有一个人可以编辑,否则将被破坏。

同事在拉动时也可能会通过转换来破坏文件,而在推动时却不会,反之亦然。再次在.gitattributes中启用/禁用此功能。

注意: 这并不能完全回答问题;请根据需要询问更多信息。另外,我无法在Mac OS上工作,所以我可能会在一些事情上出门