2016-06-15 8 views
3

Я использую git предварительно совершить крюк:Git Pre-Commit Использование Sed Для Динамически Вводят Название филиала

  1. Получить текущее имя ветви
  2. Вставьте название филиала в код
  3. изображения состояния сборки
  4. Найдите файл README.md для строки/шаблона, а затем используйте эту строку/шаблон в качестве маркера для того, где я хочу вставить динамически созданный образ состояния сборки.

Обратите внимание, что я использую OSX El Capitan v10.11.5, и для выполнения этого кода мне пришлось запустить chmod +x .git/hooks/pre-commit в сценарии предварительной фиксации.

Вот код, который я использую:

#!/bin/bash 

function git_branch { 
    git rev-parse --abbrev-ref HEAD 
} 

branch=$(git_branch) 
id="{{CODESHIP_CODE}}" 

codeship_build_status="[ ![Codeship Status for ExampleUser/exampleRepo](https://codeship.com/projects/a99d9999-9b9f-9999-99aa-999k9b9b0999/status?branch=$branch)](https://codeship.com/projects/999999)" 

sed -i -e "s%{{CODESHIP_CODE}}%$codeship_build_status%g" README.md 

На данный момент код вида работы. Под этим я имею в виду это:

  1. Правильно поиск README.md файл
  2. Удаление струнной/шаблон маркера
  3. Замена строки/шаблон маркер с переменной codeship_build_status.

Вопрос заключается в том, что это не по всей видимости, на самом деле изменения файла README.md до начала git commit и вместо этого он создает еще один файл с именем README.md-е

Когда я иду в git push и просмотреть код в репо, файл README.md не был обновлен и вместо этого содержит маркер строки/шаблона вместо обновленного образа состояния сборки. Как ни странно, файл README.md изменяется в моей локальной ветви развития.

Любые идеи, как исправить эту проблему или что может быть причиной этого?

ответ

3

Проблема sed -i. Это сообщает sed создать новый файл и сохранить старый файл с новым именем, используя следующий параметр (в вашем случае, -e) в качестве суффикса.

Для версии Mac из sed, вы должны предоставить параметр квалификационную для -i. Чтобы сделать это, сделайте то же самое, что и версия gnu/linux с этими параметрами командной строки, вы хотите предоставить пустой параметр, например:

sed -i '' -e "s%{{CODESHIP_CODE}}%$codeship_build_status%g" README.md 
+1

++; это действительно проблема; quibble: '-i' не создает _new_-файл; скорее, _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ это вывод 'sed', который создает _new_ файл, в конце концов переименованный в _original name_. (На стороне примечания: именно этот подход создает временный файл, а затем переименовывает его, чтобы заменить оригинал, который может вызвать проблемы, в первую очередь уничтожение символической ссылки.) – mklement0

+1

Конечным результатом является то, что с '-i.bak ', вы получаете два файла: создается файл. С помощью '-i ''' вы получаете один файл. –

+1

Нет аргументов в отношении результата _end. Я хотел сказать, что это _may matter_, что _original file_ _renamed_, а его замена - _new_, temp. файл, который затем переименован в исходный файл _name_. При таком подходе, который используется 'sed', вы потенциально потеряете следующие свойства файла _original_: в первую очередь, будь то символическая ссылка или нет_, но также и временная отметка _creation (в файловых системах, которые ее поддерживают (например, OSX)), _extended filesystem attributes_ (в файловых системах, которые его поддерживают (например, OSX)). (продолжение) – mklement0