【问题标题】:Git move all untracked files and folders to directory out of git? [duplicate]Git将所有未跟踪的文件和文件夹移动到git之外的目录? [复制]
【发布时间】:2018-07-07 21:25:00
【问题描述】:

我从以前的开发者那里得到了 PC。 git中有许多未跟踪的文件和文件夹(> 400)。项目应该在没有它们的情况下工作,但我不想删除或隐藏它们。也许我以后会有一些用处。

有没有办法将它们与结构一起移出 git 的备份文件夹?

【问题讨论】:

标签: git


【解决方案1】:

基于this answer,假设您可以使用 bash 命令,您可以执行如下操作(我猜您可以在 git 提示符下执行此操作)。

cd $Git_Repo
for file in $(git ls-files --others --exclude-standard); do mkdir -p ../backup/$(dirname $file) ; mv $file ../backup/$file ; done

最后一个命令在所有未跟踪的文件上循环,在备份目标文件夹文件中创建结构 (dirname)。它将文件移动到需要的位置。

注意: 如果您有带空格的文件名,则必须在命令期间为 bash 指定分隔符 IFS (source)。之后不要忘记取消设置。 命令变成了

cd $Git_Repo
IFS=$'\n'
for file in $(git ls-files --others --exclude-standard); do mkdir -p ../backup/$(dirname $file) ; mv $file ../backup/$file ; done
unset IFS

【讨论】:

  • 完美!唯一的问题是该技巧在带有20150409_2 Report.txt 之类的空格的名称上失败了。它认为有 2 个不同的文件:` mv: cannot stat '20150409_2': No such file or directory mv: cannot stat 'Report.txt': No such file or directory`
  • 你有什么升级脚本的想法吗?
  • 我更新了我的答案。您必须使用 IFS bash 变量指定分隔符。
【解决方案2】:
rsync -R `git ls-files --others` ../Backup

git ls-files --others 列出未跟踪的文件,包括忽略;如果您想排除.gitignore 中列出的文件,请添加--exclude-standard

rsync -R 将列出的文件复制到../Backup 目录保留路径中。

在使用git clean -fd 甚至git clean -fdx 进行清理工作树之后。

【讨论】:

  • 这个变种也有效,但有同样的问题。试过“rsync -R git ls-files --others --exclude-standard ../Backup”。对带有空格的名称(如 20150409_2 Report.txt)失败。它认为有 2 个不同的文件:` rsync: link_stat "20150409_2" failed: Bad file number (9) rsync: link_stat "Report.txt" failed: Bad file number (9) `
【解决方案3】:

上一个答案可能会复制可能已经在 .gitignore 中的内容,但假设您当前的存储库中只有一些暂存文件,而您只想将它​​们保存在 ./private 之类的地方,您可以这样做。

mkdir private/scratch_files_issue123/
rsync $(git status -u -s | awk '{print $2}')
git clean -df # to remove the unstanged files. 

【讨论】:

    【解决方案4】:

    您可以将这些更改保留到另一个分支作为备份分支,或者您可以将这些更改保留在另一个文件夹中,切换到备份分支由您自己决定,但我不建议为此创建额外的文件夹。

    您不想隐藏它们,但要移动这些更改,您需要隐藏它们,如果您遵循以下过程,这些将不会在您当前的分支中-

    在您当前的分支中-

    git add . 
    git checkout -b backup
    

    通过这个你已经移动了backup分支中的所有隐藏更改 在这里提交 -

    git commit -m "backup"
    

    现在backup 分支中的所有更改都已完成 您可以在不进行这些更改的情况下返回您的工作/主分支-

    git checkout -b master
    

    【讨论】:

      【解决方案5】:

      来自 Mark Longair 对How to make quick backup of untracked files which I want to delete by git clean? 的回答:

      以下命令将在您的主目录中为您目录中所有未跟踪(且未被忽略)的文件创建一个 tar 存档:

      git ls-files --others --exclude-standard -z | xargs -0 tar rvf ~/backup-untracked.tar
      

      如果您打算使用此技术,请仔细检查 git ls-files --others --exclude-standard 是否会自行生成您期望的文件列表!

      关于这个解决方案的一些注意事项可能是有序的:

      • 我使用-z 来获取git ls-files 以输出文件列表,其中NUL(零字节)作为文件之间的分隔符,-0 参数告诉它考虑xargs NUL 是它从标准输入读取的参数之间的分隔符。这是处理文件名可能包含换行符的可能性的标准技巧,因为在 Linux 上文件名中不允许出现的仅有两个字节是 NUL/
      • 如果您有大量未跟踪的文件,那么xargs 将多次运行tar 命令,所以我告诉tar 附加文件(r) 而不是创建一个新存档 (c),否则以后对 tar 的调用将覆盖之前创建的存档。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-16
        • 2015-01-11
        • 2018-07-21
        • 2016-12-19
        • 2015-12-25
        • 1970-01-01
        相关资源
        最近更新 更多